【问题标题】:Jodatime: Getting milliseconds from date yields "Illegal instant"Jodatime:从日期获取毫秒数会产生“非法即时”
【发布时间】:2016-05-13 09:28:04
【问题描述】:
  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)

【问题讨论】:

标签: date parsing jodatime


【解决方案1】:

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.parseLocalDate(date) 替换formatter.parseMillis(date)。如果由于某种原因您仍然需要毫秒,this Stack Overflow question 可能会有所帮助。

【讨论】:

  • 这是一个出生日期,我真的不在乎小时和分钟。获取纪元时间的正确方法是什么?
  • 谢谢马文,我想出了这个,但仍然失败并出现同样的错误:parseLocalDate(date).toDateTimeAtStartOfDay(ArgTimezone).getMillis
  • formatter.parseLocalDateTime("01-10-1967").toDateTime().getMillis() 为我工作。不过,要预测您的目标有点困难 - 可能有更简单的方法可以满足您的需求。
  • 我只是想获取出生日期的时间戳,因为 db 字段是一个整数。
  • 再次感谢您的见解。同样的代码对我来说失败了,也许是因为我的时区是(America/Argentina/Buenos_Aires) 而你的时区不同?我想你可以像这样给定一个格式为 dd-MM-yyyy 的日期,返回当天第一次的纪元表示(阿根廷/GMT-3)
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 2013-04-18
  • 2021-08-01
  • 2014-10-12
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多