如何使用mysql datetime列处理java日期

时间:2015-06-29 20:00:34

标签: java mysql mybatis

我有一个使用第三方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个小时,但我想知道一个更好的解决方案,因为我不喜欢这个。

其他一些信息:

  • Java版本1.8.0_45
  • Mybatis 3.0.5
  • MySQL 5.5.15
  • 我在格林威治标准时间-03:00(巴西 - 巴西利亚)
  • 为什么我使用Date.from(Instant.ofEpochSecond(timeInSeconds)) here

2 个答案:

答案 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,所以我不知道这是否能解决你的问题。但它可能会。