Java 8 timezone conversions

前端 未结 2 1032
天命终不由人
天命终不由人 2020-11-28 14:50

In Java 8, I want to convert a datetime from UTC to ACST (UTC+9:30).

input -> 2014-09-14T17:00:00+00:00

output-> 2014-09-15 02:30:00

String i         


        
相关标签:
2条回答
  • 2020-11-28 15:14

    Try:

    String isoDateTime = "2014-09-14T17:00:00+00:00";
    ZonedDateTime fromIsoDate = ZonedDateTime.parse(isoDateTime);
    ZoneOffset offset = ZoneOffset.of("+09:30");
    ZonedDateTime acst = fromIsoDate.withZoneSameInstant(offset);
    
    System.out.println("Input:  " + fromIsoDate);
    System.out.println("Output: " + acst.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); 
    

    Output:

    Input:  2014-09-14T17:00Z
    Output: 2014-09-15T02:30:00+09:30
    

    Using OffsetDateTime

    While it is generally better to use ZonedDateTime as shown above, you can perform the same conversion using OffsetDateTime as follows:

    String isoDateTime = "2014-09-14T17:00:00+00:00";
    OffsetDateTime fromIsoDate = OffsetDateTime.parse(isoDateTime);
    ZoneOffset offset = ZoneOffset.of("+09:30");
    OffsetDateTime acst = fromIsoDate.withOffsetSameInstant(offset);
    
    0 讨论(0)
  • 2020-11-28 15:16

    Slight improvement on the above. Avoids hardcoding offset. Also, takes care of daylight savings.

    public static LocalDateTime convertTo(LocalDateTime dateTime, String timeZone) {
        ZoneId zone = ZoneId.of(timeZone);
        ZonedDateTime zdt = dateTime.atZone(zone);
        ZoneOffset offset = zdt.getOffset();
        return dateTime.plus(offset.getTotalSeconds(), ChronoUnit.SECONDS);
    }
    
    0 讨论(0)
提交回复
热议问题