Jodatime:从日期开始获得毫秒数会产生“非法瞬间”

时间:2016-02-03 23:19:32

标签: date parsing jodatime

  val date = "01-10-1967"
  val pattern = "dd-MM-yyyy"
  val formatter = DateTimeFormat.forPattern(pattern)
  formatter.parseMillis(date) // this line fails

最后一行失败了:

Cannot parse "01-10-1967": Illegal instant due to time zone offset transition (America/Argentina/Buenos_Aires)

知道为什么吗?

(JodaTime版本是2.3)

1 个答案:

答案 0 :(得分:3)

1967年10月1日在阿根廷的一天,他们changed from standard time to summer time,即在00:00加1小时。

由于您没有提供具体的时间,我认为它默认为00:00,而当天根本不存在。

比照。 the official faq

  

由于时区偏移过渡导致的非法瞬发'意思?   Joda-Time仅允许密钥类存储有效的日期时间。对于   例如,2月31日不是有效日期,因此无法存储   (部分除外)。有效日期时间的相同原则适用于   夏令时(DST)。在许多地方使用DST,其中   当地时钟在春天向前移动一小时,然后在一小时后向前移动一小时   秋/下降。这意味着在春天,有一个"差距"哪里有本地的   时间不存在。错误"由于时区而导致的非法即时   偏移过渡"指的是这个差距。这意味着你的申请   试图在差距内创建一个日期时间 - 这个时间没有   存在。由于Joda-Time对象必须有效,因此不允许这样做。

可能的解决方案(取自常见问题解答):

  • 使用LocalDateTime,因为所有本地日期时间都有效。
  • LocalDate转换为DateTime时,请使用toDateTimeAsStartOfDay()处理并管理任何差距。
  • 解析时,如果要解析的字符串没有时区,请使用parseLocalDateTime()

由于您无论如何都对时间信息不感兴趣,我想您甚至可能希望将formatter.parseMillis(date)替换为formatter.parseLocalDate(date)。如果由于某种原因你还需要几毫秒,this Stack Overflow question可能会有所帮助。