提问者:小点点

如何将Java中的时间对象格式化为正确的时区


我想使用JavaAPI来获取欧洲中部夏季时间(CEST)并正确格式化它。我有以下代码:

LocalDateTime localDateTime= LocalDateTime.now();
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
localDateTime.format(myFormatObj);
ZoneId europeBerlin = ZoneId.of("Europe/Berlin");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, europeBerlin);

命令zonedDateTime. toString()返回以下输出:

2020-09-27T08:42:33.660+02:00[Europe/Berlin]

但是我想有一个输出,如之前在DateTimeFor物质("dd-MM-yyyy HH: mm:ss")。我已经格式化成这种格式的localDateTime,现在我只想得到CEST时间。我怎么做?我将感谢每一个评论。


共2个答案

匿名用户

请注意,Java时间API中的日期时间对象是不可变的。因此,当您想要修改现有的日期时间实例时,将返回一个新的副本,而旧的副本保持不变。

此外,一个小优化:DateTimeFor物质是线程安全的。因此,无需每次都构造一个新实例,因为格式是恒定的。您可以像这样在顶部声明它:

private static final DateTimeFormatter FORMATTER;

static {
    FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
}

要打印格式化的String,请使用以下命令:

LocalDateTime localDateTime = LocalDateTime.now();
ZoneId europeBerlin = ZoneId.of("Europe/Berlin");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, europeBerlin);

// please note that #format has a return value
// originally, you called 'localDateTime.format(myFormatObj);' while ignoring
// the return value
String formatted = FORMATTER.format(zonedDateTime);

System.out.println(formatted); // e.g. 27-09-2020 11:44:27

编辑1:关于线程安全线程安全是指一个对象可以安全地被多个线程并发使用,而不会破坏类的内部结构。如果一个类是线程安全的,你可以同时从多个线程调用它(因此你不需要每次都创建一个新实例,而只需要一个)。如果一个类不是线程安全的,每个线程都需要一个新实例。

匿名用户

    DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
    ZoneId europeBerlin = ZoneId.of("Europe/Berlin");
    ZonedDateTime zonedDateTime = ZonedDateTime.now(europeBerlin);
    
    String formattedDateTime = zonedDateTime.format(myFormatObj);
    System.out.println(formattedDateTime);

刚才在UTC时区运行时输出:

27-09-2020 20:33:53

我们得到了柏林时间(不是UTC时间)。

两件事:

  1. LocalDateTime.now()给出了JVM默认时区的当前时间。这似乎不是Eurpoe/柏林(也许是UTC,也可能是别的什么)。然后ZonedDateTime. of(localDateTime,Europe pe柏林)获取一天中的日期和时间,并声称这是欧洲/柏林时区,这是错误的,也是您得到错误结果的原因。您通常不需要LocalDateTime类,也几乎不需要no-argLocalDateTime.now()方法。
  2. 要以特定格式获取时间,您需要将日期和时间格式化为字符串。LocalDateTimeZonedDateTime对象没有任何格式。
  • 相关问题:
    • 在LocalDateTime中无法摆脱'T'
    • ZonedDateTime的字符串正在更改格式