从当地日期和时区获取epoch millis

时间:2017-05-17 11:54:17

标签: java java-8 java-time

我有两个字符串变量:

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

如何使用Java 8从他们那里获得epoch millis?

我已经尝试过这种方式了:

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)

2 个答案:

答案 0 :(得分:2)

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

因此,您的格式变为:

yyyyMMddHHmmssX

正如文件所说:

  

X:区域偏移 - ' Z'为零

所以你应该使用

yyyyMMddHHmmssZ

答案 1 :(得分:2)

BackSlash’ answer是正确的。关于偏移X的文档说:“五个字母输出小时和分钟,可选秒,带冒号,例如' +01:30:15'”我认为这意味着5 X也需要解析时输入字符串中的冒号。

所以这里只是我的0.02欧元补充:由于你有两个字符串,我会发现它在概念上更简单地解析每个字符串并结合结果,而不是连接字符串并解析整个字符串。此外,如果其中一个字符串包含意外的内容,如果您单独解析它们,则更容易分辨哪个字符串是错误的。

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

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