datetime根据java 8中的偏移量转换UTC时间
我得到一个时间&;字符串中的偏移量
时间以UTC为单位,我必须根据偏移量转换此时间,然后将其分配给Calendar
对象
问题是我正在使用OffsetDateTime
类的plusHours()
方法。我得到了同样的结果
OffsetDateTime odtB = OffsetDateTime.parse( "2018-03-26T06:00:00Z" ) ;
odtB.plusHours(2);
System.out.println(odtB);
例如,如果我的日期为"2018-03-26T06:00:00Z"
,而偏移量/时区值为“+02:00”,如何更改它以获取输出"2018-03-26T08:00:00Z"
# 1 楼答案
试试看
# 2 楼答案
据我所知,您希望将字符串中的日期时间(这里是3月26日上午6点)转换为本地时区UTC+2的同一时间点,即上午8点(而不是UTC)。你并没有用正确的方式来做。相反,你应该:
输出:
更好的方法是使用实时时区,而不是依赖偏移,例如:
如果您确实想要一个
OffsetDateTime
,我仍然建议您像上面那样通过相关的ZoneId
进行转换,然后返回到OffsetDateTime
:但是你说你要把它分配给一个
Calendar
。最简单、最正确的方法也是通过ZonedDateTime
:我希望你知道,
Calendar
类早已过时。仍然可能您需要一个Calendar
对象,用于一个您无法更改或只是现在不想更改的遗留API如果你想要一个不同的偏移量,你可以创建一个:
不过,我仍然建议您使用适当的时区,例如:
你的代码出了什么问题
我怀疑你有两个错误:
OffsetDateTime
加上2个小时,将使您在UTC中推迟两个小时。我想你既不想两个小时后,也不想在UTC工作一段时间李>plusHours
返回带有新值的新OffsetDateTime
。您似乎忽略了返回值,实际上放弃了结果。该方法需要返回一个新对象,因为OffsetDateTime
是不可变的李>编辑:一开始我既没有正确阅读你的问题,也不是很清楚。我已经改变了答案,所以它现在回答了我认为你的意思
# 3 楼答案
首先要做的事情是:
plusHours
方法返回另一个OffsetDateTime
,但它不会更改原来的方法。要获得该方法的结果,需要将其分配给一个变量:这将打印:
现在回答你的问题:
我觉得你误解了一些概念。最后的
Z
就是UTC designator,它和+00:00
一样上述日期(
2018-03-26T06:00:00Z
和2018-03-26T08:00Z
)均以UTC为单位,每一个日期都代表一个不同的时刻(时间线中的不同点)。当你调用plusHours(2)
时,结果是另一个OffsetDateTime
在第一个之后2小时如果你想把
OffsetDateTime
转换成另一个偏移量,你不应该增加小时。你应该这样做:现在的结果是
2018-03-26T08:00+02:00
——请注意偏移量从Z变为+02:00,但是(2018-03-26T08:00+02:00
和2018-03-26T06:00:00Z
)都表示相同的瞬间(时间线中的相同点)如果使用
isEqual
(一种checks if the dates correspond to the same instant的方法)比较结果,这一点会变得更清楚:要转换为其他偏移量,例如
+05:30
,只需更改使用的偏移量。代替ZoneOffset.ofHours(2)
,您可以使用以下选项之一: