繁体   English   中英

到ZonedDateTime的字符串正在更改格式

[英]String to ZonedDateTime is changing format

String ip="2011-05-01T06:47:35.422-05:00";
ZonedDateTime mzt = ZonedDateTime.parse(ip).toInstant().atZone(ZoneOffset.UTC);
System.out.println(mzt);

System.out.println("-----");

String ip2="2011-05-01T00:00:00.000-05:00";
ZonedDateTime mzt2 = ZonedDateTime.parse(ip2).toInstant().atZone(ZoneOffset.UTC);
System.out.println(mzt2);

输出:

2011-05-01T11:47:35.422Z
-----
2011-05-01T05:00Z

为什么在情况2中更改日期格式? 由于这个原因,我收到了SQLServer数据库错误。

这就是文档中的toString所说的

所使用的格式将是最短的格式,用于输出被省略部分隐含为零的时间的完整值。

要解决此问题,您需要另一个格式化程序:

String result = mzt2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss:SSS'Z'"));

输出量

2011-05-01T11:47:35.422Z
2011-05-01T05:00:00:000Z

只是为了补充YCF_L的答案:

在模式中使用带引号的字母,就像用Z一样(在内部引号: 'Z' )是错误的。 这会将Z当作文字,并忽略对象的偏移量。

对于这种特殊情况 ,它可以工作,但是最后的“ Z”表示日期为UTC,并且您不能将其硬编码为文字。 不管偏移量是多少,将其放在引号中始终将显示“ Z”,从而给出错误的结果。

例:

// wrong: it uses Z inside quotes
DateTimeFormatter wrong = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss:SSS'Z'");

// correct: it uses the offset pattern (X)
DateTimeFormatter correct = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss:SSSXXX");

// print a date/time not in UTC
String ip2 = "2011-05-01T00:00:00.000-05:00";
ZonedDateTime mzt = ZonedDateTime.parse(ip2);

System.out.println(mzt.format(wrong)); // 2011-05-01T00:00:00:000Z
System.out.println(mzt.format(correct)); // 2011-05-01T00:00:00:000-05:00

请注意,错误的格式化程序将打印Z,这是错误的,因为mzt的偏移量是-05:00

错误的格式化程序适合您的情况,因为您使用的是UTC:

// convert to UTC
ZonedDateTime mzt2 = mzt.withZoneSameInstant(ZoneOffset.UTC);
System.out.println(mzt2.format(wrong)); // 2011-05-01T05:00:00:000Z
System.out.println(mzt2.format(correct)); // 2011-05-01T05:00:00:000Z

在这种情况下,两个格式化程序都输出正确的结果,但这是一个巧合 ,因为mzt2使用UTC(因此偏移量是“ Z”)。 但是,对于任何不同于UTC的偏移量,只有正确的格式化程序才能工作。

还要注意,我使用了withZoneSameInstant ,其结果与使用.toInstant().atZone(ZoneOffset.UTC)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM