从本地日期和时区获取纪元毫秒

Get epoch millis from local date and timezone

我有两个字符串变量:

String localDateTime = "19700101000000";
String timeZone = "+0000";

我如何使用 Java 8 从他们那里得到纪元毫秒?

我已经尝试过这种方式:

private static Long getBeginConnectionTime(
    String dateWithTimeZone = localDateTime  + timeZone ;
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssXXXXX");
    OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateWithTimeZone, formatter);
    return offsetDateTime.toInstant().toEpochMilli();
)

但是这段代码抛出异常:

java.time.format.DateTimeParseException: Text '19700101000000+0000' could not be parsed at index 14

    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)

整个时区号码只需要一个 X

因此,您的格式变为:

yyyyMMddHHmmssX

然而,如文档所述:

X: zone-offset - 'Z' for zero

所以你应该使用

yyyyMMddHHmmssZ

是正确的。文档对偏移量 X 说:“五个字母输出小时和分钟以及可选的秒,带有冒号,例如 '+01:30:15'。”我的意思是5个X在解析的时候也需要在输入字符串中加一个冒号。

所以这只是我的 0.02 欧元补充:因为你有两个字符串,我会发现从概念上讲,解析每个字符串并组合结果比连接字符串并解析整个字符串更简单。此外,如果其中一个字符串包含意外的内容,如果您单独解析它们,则可以更简单地判断哪个字符串是错误的。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss");
    return LocalDateTime.parse(localDateTime, formatter)
            .atOffset(ZoneOffset.of(timeZone))
            .toInstant()
            .toEpochMilli();

最后一个细节,除非您有令人信服的理由,否则我建议您的方法 returns 是原始 long 而不是 Long 对象。