提问人:user737862 提问时间:5/4/2018 最后编辑:J-Alexuser737862 更新时间:5/5/2018 访问量:692
OffsetDateTime.parse(String,dateTimeFormatter) 的 Threeten DateTimeParseException
Threeten DateTimeParseException for OffsetDateTime.parse(String,dateTimeFormatter)
问:
我想简单地制作一个用于解析器的。但是我得到:DateTimeFormatter
OffsetDateTime
DateTimeParseException
final DateTimeFormatter ISO_LOCAL_DATE;
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);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
OffsetDateTime.parse("2012-03-06T00:00:00",ISO_LOCAL_DATE);
我调查了一个类似的问题,但那里也没有线索:/
上面的代码有什么问题?与 Threeten lib 有关?Formatter
答:
1赞
J-Alex
5/4/2018
#1
您未在输入数据中指定偏移量。
以下是带偏移量的日期时间示例:
2012-03-06T00:00+01:00
示例:ZonedDateTime
2012-03-06T00:00+02:00[Europe/Paris]
Europe/Berlin
- 可以认为是这里。但是,对于一年中的不同时间(夏令时/冬令时),每个区域可能有不同的偏移量。ZoneId
和 之间没有一对一的映射:有没有办法在 java 8 中将 ZoneId 转换为 ZoneOffset?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
评论
0赞
user737862
5/4/2018
非常好!你是对的。但我真正需要的是一个有效的格式化程序,用于 OffsetDateTime 解析器,这是我无法企及的,我只能为它设置一个格式化程序。是否可以从 ZonedDateTime 获取格式化程序?!由于ISO_LOCAL_DATE对 OffsetDateTime 解析器无效。
0赞
J-Alex
5/5/2018
@user737862 添加了一个示例,请参考更新后的答案。
0赞
Anonymous
5/6/2018
@user737862 我可能会重复编辑后的答案中已有的内容,但只需将格式化程序设置为 .没有理由为它构建自己的格式化程序。DateTimeFormatter.ISO_OFFSET_DATE_TIME
评论
ISO_LOCAL_DATE_TIME
ISO_LOCAL_DATE
java.time