Java - SimpleDateFormat 格式化程序以毫秒为单位返回纪元时间

Mar*_*ith 4 java datetime timestamp date epoch

我对 Java 和一般编码非常陌生 - 我有一些代码以以下格式返回时间戳,如下yyyy.MM.dd HH:mm:ss:ms所示:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:sss");
Run Code Online (Sandbox Code Playgroud)

这将返回:

2017.07.19 11:42:30:423
Run Code Online (Sandbox Code Playgroud)

有没有办法编辑上面的“SimpleDateFormat 格式化程序”代码以将日期/时间作为包含毫秒的纪元时间戳返回,以便返回的值按照以下格式进行格式化?

1500464550423
Run Code Online (Sandbox Code Playgroud)

我希望我可以修改代码的("yyyy.MM.dd HH:mm:ss:sss")一部分SimpleDateFormat formatter来做到这一点。

非常感谢任何帮助或建议。

谢谢

Ole*_*.V. 6

您在格式模式字符串中使用 case 有一个简单的错误(这些是区分大小写的)。更糟糕的是,你正在使用旧的和麻烦的SimpleDateFormat类。它的众多问题之一是它没有告诉您问题是什么。

因此,我建议您改用现代 Java 日期和时间 API(我特意逐字使用您的格式模式字符串):

    String receivedTimetamp = "2017.07.19 11:42:30:423";
    DateTimeFormatter parseFormatter
            = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:sss");
    LocalDateTime dateTime = LocalDateTime.parse(receivedTimetamp, parseFormatter);
    System.out.println(dateTime);
Run Code Online (Sandbox Code Playgroud)

此代码抛出一个IllegalArgumentException: Too many pattern letters: s. 我希望这能让您意识到您使用两个 s 表示几秒钟,三个 s 表示几分之一秒。如果仍然不清楚,文档会告诉您小写s在几秒钟内是正确的,而您需要大写S的分数。让我们修复:

    DateTimeFormatter parseFormatter
            = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:SSS");
Run Code Online (Sandbox Code Playgroud)

现在代码打印2017-07-19T11:42:30.423,所以我们已经设法正确解析字符串。

要转换为毫秒,我们仍然缺少一个关键信息:时间戳应该在哪个时区解释?我认为两个明显的猜测是 UTC 和您当地的时区(我不知道)。尝试协调世界时:

    System.out.println(dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli());
Run Code Online (Sandbox Code Playgroud)

这会产生1500464550423,这是您要求的数字。我想我们已经完成了。

如果您想要 JVM 的时区设置,请使用.atZone(ZoneId.systemDefault())代替.atOffset(ZoneOffset.UTC),但请注意该设置可能会被同一 JVM 中运行的其他软件更改,因此这很脆弱。