如何处理带和不带区域的日期

时间:2019-05-05 13:43:36

标签: java date

我的客户向我发送了ISO8601中的日期,该日期有时包含带区域的毫秒,有时没有毫秒和区域。

例如:let allevents = []; firebase.auth().onAuthStateChanged(function(user) { if (user) { database.child("myevents").child(user.uid).on("value", ...) } else { // No user is signed in. } });

我正在使用新的Java 8 API(2019-05-01T06:55:43+01:00, 2019-05-01T06:55LocalDateTime等)。

我没有找到一个带有格式化程序的DateTimeFormatter类,该类可以同时处理毫秒和区域,而没有这种处理。

我正在尝试使用单一格式进行输入日期验证

Date

我问是否有一个同时缓存两个的格式化程序,我可以使用多个日期类,如果我失败了,请继续到下一个日期类,例如(LocalDateTime,LocalDate,OffsetDateTime),但是我需要使用单个格式化程序

2 个答案:

答案 0 :(得分:3)

不同类型

如Ole V.V.评论,您的输入:

  • 2019-05-01T06:55:43 + 01:00
  • 2019-05-01T06:55

...是两种不同的动物。

第一个代表一个时刻,即时间轴上的特定点。该值包括三项信息:

  • 日期
  • 每日时间
  • UTC偏移量

第二个输入只有日期和时间。它缺少time zoneoffset-from-UTC的上下文。因此,该值代表时刻。这不是时间轴上的一点。此值表示大约26-27小时(全球时区范围)内的潜在时刻。第二个是在东京早上6点吗?还是巴黎,几个小时后早上6点发生?还是什至在几个小时后,早上6点到达魁北克?

因此,如果数据源向您提供了这些值的任意组合,则会造成混乱或损坏。我建议咨询该数据的发布者以确定其意图,并可能就其含义上的差异教育他们。

解析

  

例如:2019-05-01T06:55:43 + 01:00,2019-05-01T06:55

要回答您的特定问题:

诱捕DateTimeParseException。如果在解析一个类时抛出该异常,请尝试与另一个类进行解析。

两个输入均为标准ISO 8601格式。 java.time 类在解析/生成字符串时默认使用标准格式。因此,无需指定格式模式。

try {
    OffsetDateTime odt = OffsetDateTime.parse( input ) ;
    …
} catch ( DateTimeParseException e ) {
    LocalDateTime ldt = LocalDateTime.parse( input ) ;
    …
}

答案 1 :(得分:-1)

如果u可以默认缺少的值,则可以使用类 OffsetDateTime 进行存储。 https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

  

OffsetDateTime是日期时间的不可变表示形式,带有   偏移量。此类存储所有日期和时间字段,精度为   纳秒,以及UTC /格林威治标准时间的偏移量。例如,   值“ 2nd October 2007 at 13:45.30.123456789 +02:00”可以是   存储在OffsetDateTime中。