【问题标题】:Java Date parsing wrongly adds an hour [duplicate]Java日期解析错误地增加了一个小时[重复]
【发布时间】:2023-03-24 16:20:01
【问题描述】:

我的 DateFormat 应该是正确的(24 小时格式)

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

但是当我尝试解析 (sdf.parse(string)) 时,我遇到了最奇怪的“错误”

“2010-03-28 02:28:25”

我明白了:

2010 年 3 月 28 日星期日 03:28:25 CEST

出于某种奇怪的原因,它增加了一个小时。这也是唯一给我这种行为的日期,其他时间等都很好。代表小时的“02”总是很奇怪。

有什么想法吗?

【问题讨论】:

  • 我强烈建议不要使用旧的 java.util.Calendarjava.util.Date 类。您应该在 java.time 包中找到适当的类并使用它。
  • 至于 bug,我的钱是在夏令时 v 冬令时。
  • 不是,是因为你的时区
  • 在那个时区的凌晨 2 点,发生了什么事? timeanddate.com/time/change/france?year=2010
  • @JBNizet 我相信我在这里寻找的词是“BINGO!”

标签: java string date parsing


【解决方案1】:

正如 cmets 所述,您尝试解析的时间正是夏令时 (DST) 日期,即时间从冬季时间更改为夏季时间的一天

信息在这里:

https://www.timeanddate.com/time/dst/2010.html

【讨论】:

    【解决方案2】:

    您的时区中没有 2010-03-28 02:28:25 这样的时间。 由于夏令时,时间从 01:59:59 直接变为 03:00:00。

    为避免此类问题,请使用新的 java.time 类并始终在适当的地方指定您的时区。

    String input = "2010-03-28 02:28:25".replace( " " , "T" ) ;
    LocalDateTime ldt = LocalDateTime.parse( input ) ;  // Has no time zone nor offset-from-UTC.
    ZoneId z = ZoneId.of( "Europe/Paris" ) ;
    ZonedDateTime zdt = ldt.atZone( z ) ;
    

    【讨论】:

    • 区域设置无关。这里重要的是时区。此外,使用 java.time 不会避免这个问题。它只会以不同的方式表现出来。
    • 我指的是语言环境,而不是Locale。还是改了。
    • 这就是为什么它说“和”。 java.time 包会强制您在需要时添加时区。
    • 你到底在反对什么? “语言环境”一词仅表示某物所在的位置,我现在已将其删除以避免混淆。使用 UTC 时区确实会使 DST 消失。
    • 非常喜欢 java.time 课程,他们不会让夏季时间 (DST) 及其相关挑战消失。不过,他们在夏令时的行为是明确规定的,旧课程的文档有些模糊。
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多