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)
答案 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可能会有所帮助。