【问题标题】:DateTime to java.sql.timestamp conversion is adding +1 hourDateTime 到 java.sql.timestamp 的转换增加了 +1 小时
【发布时间】:2016-08-18 00:29:55
【问题描述】:

我正在调用我的rest api,并使用以下网址localhost:8080/api/2016-05-30T10:30:00-05:00/3

api 接收date 为String,然后将其转换为 jodatime 日期时间对象,如dateTime = DateTime.parse(date); ... 调试此代码表明它产生了预期值。

但是,当我将此日期转换为 java.sql.timestamp 时,例如 Timestamp ts = new Timestamp(dateTime.getMillis()); ... 结果时间是 2016-05-30 11:30:00.0 ... 为什么将 +1 hour 添加到时间以及转换的正确方法是什么?

一些背景

我已将时间作为时间戳保存在 sql 表中。时区(例如作为字符串 +4:00 或 -5:00)在单独的列中。

我会在我的 url 路径参数中收到一个 ISO8601 时间,并且基于此我必须从 db 中获取记录。为此,我将使用两个比较。 1 匹配时间,2 匹配时区。

【问题讨论】:

  • 您可能希望包含有关时区的信息。它通常会产生……有趣的副作用。
  • 我应该添加什么信息?我没有做任何明确的说...我的系统设置为 EDT 时区虽然
  • 我对 jodatime 不熟悉,但 java.sql.Timestamp(long) 期望参数位于 GMT 时区,我没有看到 BaseDateTime.getMillis() javadoc 中指定的任何时区,尽管它似乎使用 ISO8601,其中 Z 表示 UTC,相当于 GMT...
  • 你也试过java.util.Date(long)吗?
  • 您目前处于夏令时,这会使您的时钟提前一小时......这不是巧合。

标签: java datetime timestamp jodatime date-conversion


【解决方案1】:

ISO 8601 声明

...纽约冬季的时间是UTC-05:00

看来daylight saving time 似乎不包含在日期字符串中,这意味着您得到的是正确的时间,根据定义的时区 (-05:00)。纽约夏季时间应该是-04:00,因为夏令时不是 ISO 8601 的一部分。

您可以在数据库中添加额外的 DST 列或将其添加为参数,或者通过检查您是否处于 DST 的过程,这会因国家/地区而异(例如卡塔尔不使用它)和年复一年(例如俄罗斯几年前已经放弃了 DST),所以这不是一个可行的选择......

编辑: 另一种选择是测试时区当前是否处于 DST,如another answer 所示。然后您可以应用 -1h 偏移量。

请注意,如果 inDaylightTime() 返回 true,Joda 有一个可以使用的 minusHours() 方法。

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2015-10-26
    • 2016-06-19
    • 2016-10-30
    相关资源
    最近更新 更多