我有一个消耗第三方WebService的系统.这个WebService给了我很多关于一张票的字段。这些字段中有三个是Unix时间戳格式的日期(下面我将给出一些值..)。我使用MySQL将这些字段保存在MyBatis日期时列中。
我的问题是当我向用户显示时间时,例如:
我从webservice:1435618800接收到这个值,使用本站进行转换,到目前为止我得到了这个值:Mon, 29 Jun 2015 23:00:00 GMT。
在我的应用程序中,我从web服务获得值以分钟为单位(1435618800),并使用以下方法将其转换为日期:
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表:
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`)
);下面是我的insert中的xml,以及从myb提斯中选择的xml:
<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偏移量添加/折扣到date字段,以使GMT 00:00在我的数据库中,还是有更好的解决方案?
我解决了这个问题,增加了3个小时的约会时间,但我想知道一个更好的解决方案,因为我不喜欢这个。
一些补充资料:
Date.from(Instant.ofEpochSecond(timeInSeconds)) 这里发布于 2015-06-29 20:49:51
问题可能是,当将日期对象授予您的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;https://stackoverflow.com/questions/31124529
复制相似问题