DateTime to java.sql.timestamp conversion is adding +1 hour
我用以下url localhost:8080/api/2016-05-30T10:30:00-05:00/3调用我的rest api
api接收date为String,然后将其转换为jodatime datetime对象,如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)吗?
-
您目前正处于夏令时,这使您的时钟提前一小时......不可能是巧合。
-
我知道,但我想弄清楚的是将JodaTime转换为java.sql.timestamp的绝对方式,以便我可以执行查询。
-
@EmAe似乎没有,因为DST搞砸了(未在ISO 8601中处理)。
-
......或者实际上你做得对:使用Timestamp(long)构造函数。
-
我已经更新了我的答案,其中包含可能对您的案例有用的Timezone.inDaylightTime()方法的信息。
ISO 8601声明了这一点
... the time in New York in winter is UTC?05:00
因此,日期字符串中似乎没有包含夏令时,这意味着您获得的是正确的时间,根据定义的时区(-05:00)。 纽约夏令时应-04:00,因为DST不是ISO 8601的一部分。
您可以在数据库中添加额外的DST列或将其添加为参数,或者检查您是否在DST中,该国家/地区(例如卡塔尔不使用它)和年份(例如俄罗斯)不同 几年前已经放弃了DST),所以这不是一个可行的选择......
编辑:
另一种选择是测试时区当前是否处于夏令时,如另一个答案所示。 然后,您可以应用-1h偏移量。
请注意,如果inDaylightTime()返回true,Joda可以使用minusHours()方法。