我有两个字符串变量:
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)
答案 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
对象。