以纳秒为单位的字符串-日期转换

新手上路,请多包涵

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

我想要做的是有一个函数将像 "17.08.2012 05:35:19:7600000" 这样的字符串转换为 UTC 日期,还有一个函数接受 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 timezone 设置为 UTC ,没有运气。

我注意到的另一件事:如果我这样做 df.setLenient(false);

它给了我: java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"

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

原文由 Rhadoozooz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 730
2 个回答

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

让我们分析一下:

 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:19,然后向其添加 7,600,000 毫秒。 7,600,000 毫秒 = 7,600 秒 = 2 小时 6 分 40 秒。 5:35:19am + 02:06:40 = 7:41:59am(和 0 毫秒)。这就是你得到的结果。 (看起来您没有正确设置时区,因此 GMT 字符串比您的结果晚 3 小时。)

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

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

原文由 Cat 发布,翻译遵循 CC BY-SA 3.0 许可协议

这就是您所需要的(但它会丢失毫秒信息):

 "dd.MM.yyyy HH:mm:ss.'000000'"

如果您使用 "dd.MM.yyyy HH:mm:ss.SSSSSS" ,那么您的毫秒数将得到三个前导零。

如果您使用 "dd.MM.yyyy HH:mm:ss.SSS'000'" ,那么您可以格式化日期,但不解析任何日期。

试试看:

 public static void main(String[] args) throws ParseException {
    printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073
    printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073
    printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000
    printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000

    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad
    tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good
}

private static void printDate(String formatString) {
    Date now = new Date();
    SimpleDateFormat format = new SimpleDateFormat(formatString);
    String formattedDate = format.format(now);

    // print that date
    System.out.println(formattedDate);
}

private static void tryToParseDate(String formatString) {
    Date now = new Date();
    SimpleDateFormat format = new SimpleDateFormat(formatString);
    String formattedDate = format.format(now);

    // try to parse it again
    try {
        format.parse(formattedDate);
        System.out.println("good");
    } catch (ParseException e) {
        System.out.println("bad");
    }
}

原文由 slartidan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题