如何使用mysql datetime列处理java日期
我有一个使用第三方Web服务的系统。这个Web服务给了我很多关于票证的字段。其中三个字段是Unix时间戳格式的日期(下面我将给出带有值..的示例)。我使用MyBatis将这些字段保存在MySQL日期时间列中
我的问题是当我向用户显示时间时,例如:
我从webservice:1435618800
接收此值,使用this site转换为我获取此值的日期:Mon, 29 Jun 2015 23:00:00 GMT
在我的应用程序中,我从web服务获取以分钟为单位的值(1435618800
),并使用以下方法转换为日期:
Date date = Date.from( Instant.ofEpochSecond( Long.parseLong(StringValueFromWS)));
我将这个日期设置为一个ticket对象,然后将这个ticket对象传递给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`)
);
以下是my insert和select from mybatis中的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偏移量,以便将GMT 00:00放入我的数据库中,还是有更好的解决方案
我解决了这个问题,增加了3个小时的约会时间,但我想知道一个更好的解决方案,因为我不喜欢这个
一些补充资料:
- Java版本1.8.0_45
- Mybatis 3.0.5
- MySQL 5.5.15
- 我在格林尼治时间03:00(巴西-巴西利亚)
- 为什么我使用
Date.from(Instant.ofEpochSecond(timeInSeconds))
here
# 1 楼答案
问题可能是,在将日期对象提供给MyBaits类时,您正在序列化它。我不确定MyBaits接收和输出了什么
当您序列化它时,我将假定序列化程序在日期使用toString()方法,这会导致时间以本地时间显示。在这种情况下,解决方法是通过执行以下操作来设置时区:
您还应该通过以下操作找到mysql的时区:
# 2 楼答案
在MySQL中,应该使用时间戳数据类型,而不是DATETIME。正如the doc所说,时间戳将把传入和传出的数据调整为UTC
无论MyBatis和您的问题是什么,这通常都是最佳做法:在UTC中执行所有业务逻辑和数据存储
我不太了解MyBatis,所以我不知道这是否能解决你的问题。但它可能会