有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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"


共 (3) 个答案

  1. # 1 楼答案

    试试看

    OffsetDateTime odtB = OffsetDateTime.parse( "2019-01-16T00:05:00.000" ) ;
    odtB = odtB.plusHours(2);
    System.out.println(odtB);
    
  2. # 2 楼答案

    据我所知,您希望将字符串中的日期时间(这里是3月26日上午6点)转换为本地时区UTC+2的同一时间点,即上午8点(而不是UTC)。你并没有用正确的方式来做。相反,你应该:

        ZoneOffset myOffset = ZoneOffset.ofHours(2);
        odtB = odtB.withOffsetSameInstant(myOffset);
        System.out.println(odtB);
    

    输出:

    2018-03-26T08:00+02:00

    更好的方法是使用实时时区,而不是依赖偏移,例如:

        ZoneId myZone = ZoneId.of("Africa/Kigali");
        ZonedDateTime zdt = odtB.atZoneSameInstant(myZone);
        System.out.println(zdt);
    

    2018-03-26T08:00+02:00[Africa/Kigali]

    如果您确实想要一个OffsetDateTime,我仍然建议您像上面那样通过相关的ZoneId进行转换,然后返回到OffsetDateTime

        odtB = zdt.toOffsetDateTime();
        System.out.println(odtB);
    

    2018-03-26T08:00+02:00

    但是你说你要把它分配给一个Calendar。最简单、最正确的方法也是通过ZonedDateTime

        Calendar cal = GregorianCalendar.from(zdt);
    

    我希望你知道,Calendar类早已过时。仍然可能您需要一个Calendar对象,用于一个您无法更改或只是现在不想更改的遗留API

    如果你想要一个不同的偏移量,你可以创建一个:

        ZoneOffset myOffset = ZoneOffset.ofHoursMinutes(5, 30);
    

    不过,我仍然建议您使用适当的时区,例如:

        ZoneId myZone = ZoneId.of("Asia/Kolkata");
    

    你的代码出了什么问题

    我怀疑你有两个错误:

    • 在UTC中为OffsetDateTime加上2个小时,将使您在UTC中推迟两个小时。我想你既不想两个小时后,也不想在UTC工作一段时间
    • 正如其他人所说,plusHours返回带有新值的OffsetDateTime。您似乎忽略了返回值,实际上放弃了结果。该方法需要返回一个新对象,因为OffsetDateTime是不可变的

    编辑:一开始我既没有正确阅读你的问题,也不是很清楚。我已经改变了答案,所以它现在回答了我认为你的意思

  3. # 3 楼答案

    首先要做的事情是:plusHours方法返回另一个OffsetDateTime,但它不会更改原来的方法。要获得该方法的结果,需要将其分配给一个变量:

    OffsetDateTime odtB = OffsetDateTime.parse("2018-03-26T06:00:00Z");
    odtB = odtB.plusHours(2);
    System.out.println(odtB);
    

    这将打印:

    2018-03-26T08:00Z

    现在回答你的问题:

    For example if my date is "2018-03-26T06:00:00Z" and offset/Timezone value is "+02:00" how to change it for getting output "2018-03-26T08:00:00Z"?

    我觉得你误解了一些概念。最后的Z就是UTC designator,它和+00:00一样

    上述日期(2018-03-26T06:00:00Z2018-03-26T08:00Z)均以UTC为单位,每一个日期都代表一个不同的时刻(时间线中的不同点)。当你调用plusHours(2)时,结果是另一个OffsetDateTime在第一个之后2小时

    如果你想把OffsetDateTime转换成另一个偏移量,你不应该增加小时。你应该这样做:

    OffsetDateTime odtB = OffsetDateTime.parse("2018-03-26T06:00:00Z");
    // convert to offset +02:00
    odtB = odtB.withOffsetSameInstant(ZoneOffset.ofHours(2));
    

    现在的结果是2018-03-26T08:00+02:00——请注意偏移量从Z变为+02:00,但是(2018-03-26T08:00+02:002018-03-26T06:00:00Z)都表示相同的瞬间(时间线中的相同点)

    如果使用isEqual(一种checks if the dates correspond to the same instant的方法)比较结果,这一点会变得更清楚:

    OffsetDateTime odtB = OffsetDateTime.parse("2018-03-26T06:00:00Z");
    
    // add hours
    OffsetDateTime twoHoursLater = odtB.plusHours(2);
    System.out.println(odtB.isEqual(twoHoursLater)); // false
    
    // convert to offset +02:00
    OffsetDateTime sameInstantDifferentOffset = odtB.withOffsetSameInstant(ZoneOffset.ofHours(2));
    System.out.println(odtB.isEqual(sameInstantDifferentOffset)); // true
    

    要转换为其他偏移量,例如+05:30,只需更改使用的偏移量。代替ZoneOffset.ofHours(2),您可以使用以下选项之一:

    ZoneOffset.ofHoursMinutes(5, 30)
    ZoneOffset.of("+05:30")