我有从Strings解析的两个ZoneOffset对象。如何总结并适用于ZonedDateTime?
例如:
原始ZonedDateTime为2017-12-27T18:30:00
,第一个偏移为+03
,第二个偏移为+05
如何获得2017-12-28T18:30:00+08:00
或2017-12-28T10:30:00
的输出?
答案 0 :(得分:2)
我这样理解你的问题(请检查一下是否正确):你有一个ZonedDateTime
与UTC的通常偏差。我会称之为dateTimeWithBaseOffset
。而且你有另一个ZonedDateTime
,其偏移量相对于前者ZonedDateTime
的偏移量。这真的不对;该类的设计者决定偏移量来自UTC,但有人使用它与预期不同。我会打电话给后者dateTimeWithOffsetFromBase
。
当然,如果您可以修复使用非正统偏移生成dateTimeWithOffsetFromBase
的代码,那么最好。我假设现在这不是你可以使用的解决方案。因此,您需要将不正确的偏移更正为与UTC的偏移量。
这不错:
ZoneOffset baseOffset = dateTimeWithBaseOffset.getOffset();
ZoneOffset additionalOffset = dateTimeWithOffsetFromBase.getOffset();
ZoneOffset correctedOffset = ZoneOffset.ofTotalSeconds(baseOffset.getTotalSeconds()
+ additionalOffset.getTotalSeconds());
OffsetDateTime correctedDateTime = dateTimeWithOffsetFromBase.toOffsetDateTime()
.withOffsetSameLocal(correctedOffset);
System.out.println(correctedDateTime);
使用您的样本日期时间打印
2017-12-28T18:30+08:00
如果您想要UTC时间:
correctedDateTime = correctedDateTime.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println(correctedDateTime);
这将打印您要求的日期时间:
2017-12-28T10:30Z
对于带偏移量的日期时间,我们不需要使用ZonedDateTime
,OffsetDateTime
会做,并且可以更好地与读者沟通我们所做的事情({{1}但也有效。)