您没有在输入数据中指定偏移量。
这是一个带有偏移量的日期时间示例:
2012-03-06T00:00+01:00
示例ZonedDateTime
:
2012-03-06T00:00+02:00[Europe/Paris]
Europe/Berlin
- 可以认为是ZoneId
这里。但是每个区域在一年中的不同时间(夏季/冬季时间)可能有不同的偏移量。
ZoneId
和之间没有一对一的映射ZoneOffset
:
有没有办法在 java 8 中将 ZoneId 转换为 ZoneOffset?
ZoneOffset
您可以指定而不是指定ZoneId
,偏移量将自动确定。
然后您可以获取ZonedDateTime
并将其转换为OffsetDateTime
.
public OffsetDateTime ZonedDateTime.toOffsetDateTime()
这将使用本地日期时间和偏移量创建偏移日期时间。区域 ID 被忽略。
针对您的情况指定的修复ZoneId
:
public class Main {
private static final DateTimeFormatter ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR, 2)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH, 2)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY,2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR,2)
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE,2)
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT)
.withChronology(IsoChronology.INSTANCE)
.withZone(ZoneId.systemDefault()); // or whatever you have
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2012-03-06T00:00:00", ISO_LOCAL_DATE);
System.out.println(zonedDateTime);
System.out.println(zonedDateTime.toOffsetDateTime());
}
}
近似输出:
2012-03-06T00:00+01:00[Europe/City]
2012-03-06T00:00+01:00
修复的第二个选项 - 添加offsetId()
到您的解析器构建器并为输入字符串指定偏移部分:
public class Main {
private static final DateTimeFormatter ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR, 2)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH, 2)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY,2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR,2)
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE,2)
.appendOffsetId()
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT)
.withChronology(IsoChronology.INSTANCE);
public static void main(String[] args) {
OffsetDateTime offsetDateTime = OffsetDateTime.parse("2012-03-06T00:00:00+02:00", ISO_LOCAL_DATE);
System.out.println(offsetDateTime);
}
}
输出:
2012-03-06T00:00+02:00
您可以指定自己的偏移模式,而不是.appendOffsetId()
像:
.appendOffset("+HH:mm", "Z")
顺便说一句,DateTimeFormatter
您可以使用开箱即用的标准来解析OffsetDateTime
.
public class Main {
public static void main(String[] args) {
String offsetStringTime = "2012-03-06T00:00:00+02:00";
OffsetDateTime offsetDateTime = OffsetDateTime.parse(offsetStringTime);
OffsetDateTime offsetDateTime2 = OffsetDateTime.parse(offsetStringTime, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
OffsetDateTime offsetDateTime3 = OffsetDateTime.parse(offsetStringTime, DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(offsetDateTime);
System.out.println(offsetDateTime2);
System.out.println(offsetDateTime3);
}
}
输出:
2012-03-06T00:00+02:00
2012-03-06T00:00+02:00
2012-03-06T00:00+02:00