【发布时间】:2018-02-14 14:27:58
【问题描述】:
我有一个 MySQL 表,其中包含 date() 和 time() 列,例如
CREATE TABLE `vol` (
`ID` bigint(20) unsigned NOT NULL,
`DEPART_DATE_VOL` date NOT NULL,
`DEPART_HEURE_VOL` time NOT NULL,
`ARRIVEE_DATE_VOL` date NOT NULL,
`ARRIVEE_HEURE_VOL` time NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我需要在 WHERE 子句中使用 date() 查询行,因此我不会有 datetime() 或时间戳(另外,我无法修改数据库)
在我的 DAO 中获取信息时,我连接日期和时间列来解析 Java 日期,例如:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
addon.setDateDepart(sdf.parse(rs.getString(DEPART_DATE_VOL) + " " + rs.getString(DEPART_HEURE_VOL)));
addon.setDateArrivee(sdf.parse(rs.getString(ARRIVEE_DATE_VOL) + " " + rs.getString(ARRIVEE_HEURE_VOL)));
对于有出发日期的一行:
- 2018-02-26 10:50:00 生成的 Java 日期正确
但是对于到达日期:
- 2018-02-26 12:20:00 生成的 Java 日期设置为 2018-02-26T00:20:00
TMP 解决方案
现在,我会坚持
addon.setDateDepart(new LocalDateTime(rs.getString(DEPART_DATE_VOL) + "T" + rs.getString(DEPART_HEURE_VOL)).toDate());
addon.setDateArrivee(new LocalDateTime(rs.getString(ARRIVEE_DATE_VOL) + "T" + rs.getString(ARRIVEE_HEURE_VOL)).toDate());
这似乎可行,虽然我不确定我是否会遇到时区问题...
【问题讨论】:
-
我建议你避免使用
SimpleDateFormat类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 中做得更好。 -
您使用的是
hh,它适用于 12 小时制时钟。使用kk代替 24 小时制。但是是的,您应该尝试改用java.time。 :) -
在您的解决方法中,您使用的是
LocalDateTime— 来自 Joda-Time?这已经比旧的 Java 日期和时间类好。 -
很难理解为什么会有这样的行为。我也很好奇。我想到的是同步,尽管您的代码中没有多个线程(应该归咎于 DAO?)。 日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。我真的很想知道你的例子中是否有这种情况。
-
使用 Java 8 或更高版本以及兼容 JDBC 4.2 的 JDBC 驱动程序,您应该能够做到
LocalDateTime.of(rs.getObject(DEPART_DATE_VOL, LocalDate.class), rs.getObject(DEPART_HEURE_VOL, LocalTime.class))。
标签: java date simpledateformat