0

我的代码似乎有问题。我希望我的输出中有不同的时间——一个从 UTC 转换为德国时间,一个转换为巴西东部时间,但我总是得到相同的 UTC 时间输出。

我的代码:

        LocalDateTime localDateTime = resource.getDateOfManufacture();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy_HH-mm-ss", Locale.getDefault());      
        ZoneId zoneDE = ZoneId.of("Europe/Berlin");
        ZoneId zoneBR = ZoneId.of("Brazil/East");
        
        System.out.println("TIME --------------------------------------------------------------------");
        
        System.out.println(localDateTime);
        
        System.out.println(localDateTime.atZone(zoneDE));
        System.out.println(localDateTime.atZone(zoneBR));

        System.out.println(localDateTime.atZone(zoneDE).format(dateTimeFormatter));
        System.out.println(localDateTime.atZone(zoneBR).format(dateTimeFormatter));

我的实际输出:

13:06:43,890 INFO  [stdout] (EJB default - 2) TIME --------------------------------------------------------------------
13:06:43,904 INFO  [stdout] (EJB default - 2) 2016-05-31T22:00
13:06:43,907 INFO  [stdout] (EJB default - 2) 2016-05-31T22:00+02:00[Europe/Berlin]
13:06:43,908 INFO  [stdout] (EJB default - 2) 2016-05-31T22:00-03:00[Brazil/East]
13:06:43,913 INFO  [stdout] (EJB default - 2) 31-05-2016_22-00-00
13:06:43,917 INFO  [stdout] (EJB default - 2) 31-05-2016_22-00-00

我的期望(关于最后两行):

13:06:43,890 INFO  [stdout] (EJB default - 2) TIME --------------------------------------------------------------------
13:06:43,904 INFO  [stdout] (EJB default - 2) 2016-05-31T22:00
13:06:43,907 INFO  [stdout] (EJB default - 2) 2016-05-31T22:00+02:00[Europe/Berlin]
13:06:43,908 INFO  [stdout] (EJB default - 2) 2016-05-31T22:00-03:00[Brazil/East]
13:06:43,913 INFO  [stdout] (EJB default - 2) 01-06-2016_00-00-00
13:06:43,917 INFO  [stdout] (EJB default - 2) 31-05-2016_19-00-00
4

2 回答 2

3

您的代码只是将一个区域添加到没有 zone的本地日期时间。前 2 行准确地显示了这些结果。您的日期时间格式化程序也不会做任何特别的事情,他们只是格式化所有内容,但忽略区域。

您可能有的误解是,您可能认为本地日期时间代表 UTC 中的日期时间。他们没有。它们只是年、月、日、小时、分钟、秒和纳米的组合。

您期望的输出表明您希望在另一个时区获取相应的日期时间(如果localDateTime是 UTC)。您实际上是在问,鉴于我将在 UTC 的这个日期举办派对,我需要制作什么字符串,以便我可以告诉我在柏林和巴西的朋友来参加派对?

一种方法是ZonedDateTime在 zone获取 a UTC,然后设置日期时间格式化程序的区域:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy_HH-mm-ss", Locale.getDefault()); 
ZoneId zoneDE = ZoneId.of("Europe/Berlin");
ZoneId zoneBR = ZoneId.of("Brazil/East");
DateTimeFormatter formatterDE = dateTimeFormatter.withZone(zoneDE);
DateTimeFormatter formatterBR = dateTimeFormatter.withZone(zoneBR);

System.out.println(localDateTime.atZone(ZoneOffset.UTC).format(formatterDE));
System.out.println(localDateTime.atZone(ZoneOffset.UTC).format(formatterBR));
于 2021-02-08T12:28:12.013 回答
2

ZonedDateTime#withZoneSameInstant

使用它来获取具有不同时区的日期时间的副本,保留瞬间。您需要转换LocalDateTimeZonedDateTimeatUTC然后应用.withZoneSameInstant(zoneId)如下所示:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy_HH-mm-ss", Locale.ENGLISH);
        ZoneId zoneDE = ZoneId.of("Europe/Berlin");
        ZoneId zoneBR = ZoneId.of("Brazil/East");
        LocalDateTime ldt = LocalDateTime.parse("2016-05-31T22:00");
        System.out.println(ldt);

        // Date-time in Europe/Berlin
        ZonedDateTime zdtDE = ldt.atZone(ZoneOffset.UTC).withZoneSameInstant(zoneDE);
        System.out.println(zdtDE.format(dateTimeFormatter));

        // Date-time in Brazil/East
        ZonedDateTime zdtBR = ldt.atZone(ZoneOffset.UTC).withZoneSameInstant(zoneBR);
        System.out.println(zdtBR.format(dateTimeFormatter));
    }
}

输出:

2016-05-31T22:00
01-06-2016_00-00-00
31-05-2016_19-00-00
于 2021-02-08T12:31:24.197 回答