如何将 ZonedDateTime 格式化为字符串?

新手上路,请多包涵

我想将 ZonedDateTime 转换为 String 格式为 ("dd/MM/yyyy - hh:mm") 。我知道这在 Joda-Time 其他类型中是可能的,只需使用它们的 toString("dd/MM/yyyy - hh:mm") ….但这不适用于 ZonedDateTime.toString()

如何将 ZonedDateTime 格式化为 String


编辑:

我试图在另一个时区打印时间,结果似乎总是一样的:

 ZonedDateTime date = ZonedDateTime.now();
ZoneId la = ZoneId.of("America/Los_Angeles");
ZonedDateTime date2 = date.of(date.toLocalDateTime(), la);

// 24/02/2017 - 04:53
System.out.println(DateTimeFormatter.ofPattern("dd/MM/yyyy - hh:mm").format(date));
// same result as the previous one
// 24/02/2017 - 04:53
System.out.println(DateTimeFormatter.ofPattern("dd/MM/yyyy - hh:mm").format(date2));

而且我和洛杉矶不在同一个时区。


编辑 2:

找到了如何更改时区:

 // Change this:
ZonedDateTime date2 = date.of(date.toLocalDateTime(), la); // incorrect!
// To this:
ZonedDateTime date2 = date.withZoneSameInstant(la);

原文由 Michel Feinstein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

格式 dd/MM/yyyy - hh:mm 没有意义

格式 dd/MM/yyyy - hh:mm 没有意义,因为缺少 a 这赋予了它意义。请注意 h 代表 时钟时间 am-pm (1-12)a 代表 am-pm-of-day 即没有 a h 返回的小时将是不明确的,例如没有 ah 将不会区分上午9:00。

因此,使用 H 代表 一天中的小时 (0-23) 或使用 ha

此外,始终将 Locale 与格式化程序一起使用,因为 Date-Time parsing/formatting API is Locale-sensitive

 ZoneId zoneId = ZoneId.of("Europe/London");
ZonedDateTime zdt9Am = ZonedDateTime.of(LocalDate.now(), LocalTime.of(9, 0), zoneId);
ZonedDateTime zdt9Pm = ZonedDateTime.of(LocalDate.now(), LocalTime.of(21, 0), zoneId);

DateTimeFormatter ambiguousFormatter =
                    DateTimeFormatter.ofPattern("dd/MM/yyyy - hh:mm", Locale.ENGLISH);
String ambiguosDtStr1 = zdt9Am.format(ambiguousFormatter);
String ambiguosDtStr2 = zdt9Pm.format(ambiguousFormatter);
System.out.println(ambiguosDtStr1); // 08/10/2022 - 09:00
System.out.println(ambiguosDtStr2); // 08/10/2022 - 09:00

DateTimeFormatter correctAmPmFormatter =
                    DateTimeFormatter.ofPattern("dd/MM/yyyy - hh:mm a", Locale.ENGLISH);
System.out.println(zdt9Am.format(correctAmPmFormatter)); // 08/10/2022 - 09:00 AM
System.out.println(zdt9Pm.format(correctAmPmFormatter)); // 08/10/2022 - 09:00 PM

DateTimeFormatter correct24HourFormatter =
                    DateTimeFormatter.ofPattern("dd/MM/yyyy - HH:mm", Locale.ENGLISH);
System.out.println(zdt9Am.format(correct24HourFormatter)); // 08/10/2022 - 09:00
System.out.println(zdt9Pm.format(correct24HourFormatter)); // 08/10/2022 - 21:00

查看 DateTimeFormatter 文档以了解更多信息。

Trail:Date Time 了解有关 现代日期时间 API 的更多信息。

原文由 Arvind Kumar Avinash 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题