时间偏移量java_关于date:java.time DateTimeFormatter模式的时区偏移量

我正在尝试解析:2014-05-02-10.45.05.993280-5:00其中-5:00是UTC的偏移量。 在Java 8中使用java.time DateTimeFormatter。

对于第一点,我具有以下内容:yyyy-MM-dd-HH.mm.ss.SSSSSS但是,我无法弄清楚解析偏移量的模式也应该是什么。

如果我的偏移量为4位数字(-05:00),则可以使用:yyyy-MM-dd-HH.mm.ss.SSSSSSxxx,但这对3位数字无效。

有任何想法吗?

使用大写字母X代替x,因此使用XXX。区别在于大X可以将输入字母" Z"识别为UTC-Offset +00:00,而小模式X则不能识别。

建议的模式:

yyyy-MM-dd-HH.mm.ss.SSSSSSXXX

还请注意以下JDK错误:

java.time.format.DateTimeFormatter cannot parse an offset with single

digit hour

更新:

现在,我已经在错误日志中测试了所描述的解决方法。

String input ="2014-05-02-10.45.05.993280-5:00";

DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM","Z").toFormatter();

System.out.println(f.parse(input, ZonedDateTime::from));

但这会引发异常:

Exception in thread"main" java.time.format.DateTimeParseException:

Text '2014-05-02-10.45.05.993280-5:00' could not be parsed at index 26

at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)

at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)

at HelloWorld.main(HelloWorld.java:16)

因此,宽大的解析也无济于事。因此,现在只剩下三个选项:

使用错误报告者建议的解决方法:解决方法是分别解析日期/时间,使用手动编码的解析器作为偏移量,并将LocalDateTime与手动解析的偏移量组合。并非易事。

尝试您自己的专用字符串预处理。如果使用固定格式,则可以尝试在位置26插入零数字(如果总输入长度太小一位)。

或者,您可以使用可以执行此操作的外部库。如果您愿意添加额外的依赖关系,我的库Time4J(v4.0)可以做到。参见以下代码:

String input ="2014-05-02-10.45.05.993280-5:00";

ZonalDateTime zdt =

ZonalDateTime.parse(

input,

Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR));

System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00

ZonedDateTime result = zdt.toTemporalAccessor();

更新:根据JDK-bug-status,该错误已针对Java-9进行了修复,但是Java-8的反向端口似乎不可用。

该模式不起作用...但是该错误的链接确实像我的问题。 我尝试了构建器的建议,但这似乎也不起作用。

@猎豹你是对的。 对不起,您受到该错误的困扰。 如果您可以使用任何其他替代方法,请另参阅我的更新。

SimpleDateFormat符号的偏移量是Z检查Java7或Java8 SimpleDateFormat API。

然后,您的String解析器格式

2014-05-02-10.45.05.993280-5:00

一定是:

yyyy-MM-dd-HH.mm.ss.SSSSSSZ

更新:对于DateTimeFormatter,用于格式化和解析的偏移量模式为:

O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;

X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;

x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;

Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

DateTimeFormatter中所需的模式是X。

我正在使用DateTimeFormatter并添加Z不能正常工作

您两次链接到Java 7。 Java 8 API在这里。

我尝试了这种方法的变体,但无法在格林尼治标准时间将其打印为" +00:00"格式。 它只会打印" +0000"。 另一方面,如果时区至少偏移了1,则DateTimeFormatter.ISO_OFFSET_DATE_TIME将打印以前的所需模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值