纳秒级字符串日期转换

我一直在为Android应用程序的这段代码而苦苦挣扎,我无法掌握它的窍门。我已经阅读并尝试了在stackoverflow和其他地方找到的所有解决方案,但仍然没有运气。

我想做的是有一个函数来将字符串转换为UTC日期,以及一个函数来获取并将其转换为类似这样的字符串。"17.08.2012 05:35:19:7600000"UTC date

String value = "17.08.2012 05:35:19:7600000";
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
try
{
  Date today = df.parse(value);
  System.out.println("Today = " + df.format(today) + " " + today.toGMTString());
} 
catch (ParseException e)
{
  e.printStackTrace();
}

这导致 :两者都是错误的。Today = 17.08.2012 07:41:59:0000000 17 Aug 2012 04:41:59 GMT

我尝试设置为 ,没有运气。
我注意到的另一件事是:如果我这样做
,它会给我:。SDF's timezoneUTCdf.setLenient(false);java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"

如果有人能为我提供一些解释/示例代码,我将不胜感激。提前致谢


答案 1

你得到的结果是绝对正确的。

让我们来分析一下:

17.08.2012 05:35:19:7600000
  • 17:月中的一天(17日)
  • 08: 一年中的月份(八月)
  • 2012: 年 (2012)
  • 05: 一天中的一小时(凌晨5点)
  • 35:一小时(35)
  • 19: 分钟秒 (:19)
  • 7600000:毫秒秒 (7,600,000)

现在,VM 看到这种情况的方式是,将一天中的时间声明为 5:35:19am,然后向其添加 7,600,000 毫秒。7,600,000 毫秒 = 7,600 秒 = 2 小时 6 分钟 40 秒。5:35:19am + 02:06:40 = 7:41:59am(和 0 毫秒)。这就是你得到的结果。(您似乎没有正确设置时区,因此 GMT 字符串比结果晚 3 小时。

如果你想保留,据我所知,这是不可能的。由于这可以简化为几秒钟,因此 VM 会自动将其减少到其他时间增量。毫秒 (the ) 应该用于存储值 <1000。:7600000SSSS

我建议你为你的输出创建一个新的;但请记住,毫秒将被吸收到其他时间(因为它们都作为单个存储在对象中)。SimpleDateFormatlongDate


答案 2
    private String convertDate(String cdate)
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
    SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd");
    Date convertedDate;
    try
    {
        convertedDate = dateFormat.parse(cdate);
        cdate = postFormater.format(convertedDate);
    }
    catch (ParseException e)
    {
        Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show();
    }
    return cdate;
}

试试这个。