2 回答
TA贡献1794条经验 获得超7个赞
您可以执行以下操作:
String sign = "+";
String [] parts = time.split(sign);
Long millis = Long.parseLong(parts[0]);
String zoneOffset = sign + parts[1];
LocalDate date = Instant.ofEpochMilli(millis).atZone(ZoneOffset.of(zoneOffset)).toLocalDate();
TA贡献1798条经验 获得超3个赞
String exampleString = "1517439600000+0100";
// Split string before + or-
String[] parts = exampleString.split("(?=[+-])");
if (parts.length != 2) {
throw new IllegalArgumentException("Unexpected/unsupported format: " + exampleString);
}
// Parse the milliseconds into an Instant
Instant timeStamp = Instant.ofEpochMilli(Long.parseLong(parts[0]));
// Parse the offset into a ZoneOffset
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("xx");
ZoneOffset offset = ZoneOffset.from(offsetFormatter.parse(parts[1]));
// Combine
OffsetDateTime dateTime = timeStamp.atOffset(offset);
System.out.println(dateTime);
输出:
2018-02-01T00:00+01:00
自纪元 (1 517 439 600 000) 以来的毫秒数表示与时区或偏移无关的时间点。所以为了获得时间戳,解析这个数字就足够了。如果您对Instant(示例中的 2018-01-31T23:00:00Z)感到满意,您当然可以删除代码的后半部分。我的风格是在我不需要所有信息时也从字符串中收集所有信息。
我用于拆分的正则表达式(?=[+-]), 是一个正向预测:它匹配 a+或之前的空字符串-。匹配空字符串很重要,因此字符串的任何部分都不会在拆分中丢失(我们需要保留符号)。
解析偏移量的一种更简单的方法是ZoneOffset.of(parts[1])(正如 NiVeR 在另一个答案中所做的那样)。唯一的区别是DateTimeFormatter我使用的还验证格式确实是像+0100(无冒号)或Z.
添加回答
举报