当前位置: 首页 > 知识库问答 >
问题:

在 Java8 中使用时区设置 LocalDateTime 的格式

吴和硕
2023-03-14

我有这个简单的代码:

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)

然后我将得到以下异常:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.LocalDateTime.getLong(LocalDateTime.java:720)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser.format(DateTimeFormatterBuilder.java:3315)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDateTime.format(LocalDateTime.java:1746)

如何解决这个问题?

共有2个答案

井誉
2023-03-14

JSR-310(也称为Java-8中的java.time包)中的前缀“本地”并不表示该类的内部状态中存在时区信息(此处:LocalDateTime)。尽管名称经常误导人,但像LocalDateTimeLocalTime这样的类没有时区信息或偏移量。

您尝试使用偏移信息(由图案符号 Z 指示)格式化此类时态类型(不包含任何偏移)。因此,格式化程序尝试访问不可用的信息,并且必须引发您观察到的异常。

解决方案:

使用具有此类偏移量或时区信息的类型。在 JSR-310 中,这是 OffsetDateTime(包含偏移量,但不包含 DST 规则的时区)或 ZonedDateTime。您可以通过查找方法isSupported(TemporalField)来观察此类类型的所有受支持字段。OffsetDateTime 和 ZonedDateTime 中支持 OffsetSeconds 字段,但在 LocalDateTime 中不受支持。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
String s = ZonedDateTime.now().format(formatter);
云开诚
2023-03-14

LocalDateTime 是没有时区的日期时间。您在格式中指定了时区偏移量格式符号,但是,LocalDateTime 没有此类信息。这就是发生错误的原因。

如果需要时区信息,应使用ZonedDateTime

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
ZonedDateTime.now().format(FORMATTER);
=> "20140829 14:12:22.122000 +09"
 类似资料:
  • 问题内容: 我有这个简单的代码: 然后我将得到以下异常: 如何解决这个问题? 问题答案: 是没有时区的日期时间。您以格式指定了时区偏移格式符号,但是没有此类信息。这就是为什么发生错误。 如果您需要时区信息,请使用。

  • Java 8 添加了一个新的 java.time API 来处理日期和时间 (JSR 310)。 我有字符串形式的日期和时间(例如< code >“2014-04-08 12:30”)。如何从给定的字符串中获取< code>LocalDateTime实例? 在我完成对象的工作后:如何将实例转换回与上述格式相同的字符串?

  • 但如何在指定时区设置日期的格式? 无论浏览器的当前时间如何,我都希望得到一致的结果,但我不希望以UTC显示日期。

  • 我在两个地方为一个组织工作。其中之一是智利,那里的夏令时极难预测,往往每年都有变化。我们有一个依赖于时间的应用程序,直到现在,一直在使用joda time。当智利政府决定更改夏令时,我们使用joda代码将偏移量设置为默认的: 另外,在Java8Time中转换单元的最佳方法是什么?假设我有24小时,我想把它换算成几天。(我这样问是因为在这种情况下,似乎很多方法都是以毫秒为单位工作的,而我想要以小时为

  • 问题内容: Python是否可以像这样在PHP中设置时区: 使用共享的虚拟主机时,我无法真正安装任何其他模块。 有任何想法吗? 问题答案: 要获取您列出的特定值: 有关指令的完整列表,请参见此处。请记住,strftime()函数将始终返回字符串,而不是整数或其他类型。

  • 我试图从LocaLDateTime创建json对象,但由于某种原因,它创建json的方式如下:查找issueAt和expireAt键 json{“userid”:0,“deviceid”:0,“refreshtoken”:“93180548-23B3-4D1B-8B5B-A105B7CFF7F9”,“issuedat”:{“年份”:2021,“月份值”:10,“月份日”:27,“小时”:9,“分钟