有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用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

共 (2) 个答案

  1. # 1 楼答案

    问题可能是,在将日期对象提供给MyBaits类时,您正在序列化它。我不确定MyBaits接收和输出了什么

    当您序列化它时,我将假定序列化程序在日期使用toString()方法,这会导致时间以本地时间显示。在这种情况下,解决方法是通过执行以下操作来设置时区:

    Date d = Date.from(Instant.ofEpochSecond(1435618800));
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    

    您还应该通过以下操作找到mysql的时区:

    mysql> SELECT @@global.time_zone, @@session.time_zone;
    
  2. # 2 楼答案

    在MySQL中,应该使用时间戳数据类型,而不是DATETIME。正如the doc所说,时间戳将把传入和传出的数据调整为UTC

    无论MyBatis和您的问题是什么,这通常都是最佳做法:在UTC中执行所有业务逻辑和数据存储

    我不太了解MyBatis,所以我不知道这是否能解决你的问题。但它可能会