我有一个使用第三方WebService的系统。这个WebService给了我很多关于票证的字段。其中三个字段是带有Unix时间戳格式的日期(下面我将给出带值的示例..)。我使用MyBatis将这些字段保存在MySQL datetime列中。
我的问题是当我向用户显示时间时,例如:
我从网络服务1435618800
收到此值,使用this site转换为日期我得到此值:Mon, 29 Jun 2015 23:00:00 GMT
。
在我的应用程序中,我从Web服务获得分钟(1435618800
)的值,并使用以下命令转换为Date:
Date date = Date.from( Instant.ofEpochSecond( Long.parseLong(StringValueFromWS)));
我将此日期设置为故障单对象,然后将此故障单对象传递给MyBatis以保存到我的表中。当我查看表格时,我看到了值2015-06-29 20:00:00
。
当我显示此值时,用户会看到以下时间:2015-06-29 17:00:00
,他们应该看到2015-06-29 20:00:00
。
这是创建表:
CREATE TABLE `ticket` (
`id_ticket` int(11) NOT NULL AUTO_INCREMENT,
`open_date` datetime DEFAULT NULL,
`callback_date` datetime DEFAULT NULL,
PRIMARY KEY (`id_ticket`)
);
这是我插入的xml,并从mybatis中选择:
<select id="getTicket" parameterType="PaginationFilter" resultType="Ticket">
<![CDATA[
SELECT
t.id_ticket as 'id',
t.open_date as 'openDate',
t.callback_date as 'callbackDate'
from ticket as t
WHERE t.id_ticket = XXX
]]>
</select>
<insert id="insertTicket" parameterType="Ticket" useGeneratedKeys="true" keyProperty="id">
INSERT INTO ticket
(
`open_date`,
`callback_date`
)
VALUES
(
#{openDate},
#{callbackDate}
);
</insert>
我怀疑这是最优雅的解决方案。我应该在插入MySQL之前将GMT偏移量添加/折扣到日期字段,以便在我的数据库中使用GMT 00:00还是有更好的解决方案?
我解决了这个问题,在我的日期增加了3个小时,但我想知道一个更好的解决方案,因为我不喜欢这个。
其他一些信息:
Date.from(Instant.ofEpochSecond(timeInSeconds))
here 答案 0 :(得分:0)
问题可能是您在将日期对象提供给MyBaits类时序列化日期对象。我不确定MyBaits接收和输出的内容。
序列化时,我假设序列化程序在日期使用toString()方法,导致时间以本地时间显示。在这种情况下,解决方法是通过执行以下操作来设置TimeZone:
Date d = Date.from(Instant.ofEpochSecond(1435618800));
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
您还应该通过执行以下操作找出mysql的时区:
mysql> SELECT @@global.time_zone, @@session.time_zone;
答案 1 :(得分:0)
在MySQL中,您应该使用TIMESTAMP数据类型而不是DATETIME。正如the doc所说,TIMESTAMP会将传入和传出数据调整为UTC。
这通常是最佳做法,无论MyBatis和您的问题如何:以UTC格式存储您的所有业务逻辑和数据。
我不太了解MyBatis,所以我不知道这是否能解决你的问题。但它可能会。