我正在使用 MySQL 5.0。我需要将日期时间信息存储在一列中。我的意思是使用DATETIME
或TIMESTAMP
列类型。但是我对夏冬时间的变化有疑问。
我的时区是 CET。夏季我们使用夏令时(CEST,GMT+2),冬季我们使用冬季时间(CET,GMT+1)。在夏令时变为冬令时的那一天(今年 2012 年是 10 月 28 日)我们有两次凌晨 2:00 的时间。这一天的时间顺序是:
... -> 1:00 CEST -> 2:00 CEST -> 2:00 CET (= 3:00 CEST) -> 3:00 CET -> ...
因此,如果我有时间戳/日期时间 '2012-10-28 02:00:00' 我无法正确地说出这个时间是代表夏季时间还是冬季时间凌晨 2:00。
我有两个不同的 Java 日期:
Date d1 = new Date(1351382400000); // 2:00 CEST (summer-time)
Date d2 = new Date(1351386000000); // 2:00 CET (winter-time)
当我使用标准时间戳/日期时间格式(即'yyyy-MM-dd HH:mm:ss'
)将它们存储在数据库中时,它们都存储相同的数据“2012-10-28 02:00:00”。但是当我从数据库中将这些值返回到日期变量中时,我得到了两个相同的日期。所以输入日期不同但输出日期相同。
如果我使用该FROM_UNIXTIME
函数存储日期值,也会发生同样的情况:FROM_UNIXTIME(1351382400)
和FROM_UNIXTIME(1351386000)
. 值作为相等值存储在数据库列(DATETIME 或 TIMESTAMP 类型)中。因此,当我将这些值放入 Java 的 Date 对象中时,我会再次获得两个相等的日期(在冬季)。
有没有办法将时区存储在 MySQL 中,或者如何处理 DATETIME/TIMESTAMP 列中的时区信息?
当然,我可以使用 unix-timestamp 将 BIGINT 值存储在数据库中。但我想知道是否有任何方法可以解决任何 MySQL 日期时间类型的问题。
任何帮助或技巧表示赞赏...... :)
非常感谢。
Honza (sporak)
编辑#1:
如果我尝试存储时间戳值,然后将此时间戳值提取到 java 的日期中,我会再次得到错误的日期。假设我有一个带有 TIMESTAMP 列的简单表。我以这种方式将数据存储在此表中:
mysql> INSERT INTO `tab` (timestamp_column) VALUES
(FROM_UNIXTIME(1351382400)), // 2:00 CEST (summer-time)
(FROM_UNIXTIME(1351386000)); // 2:00 CET (winter-time)
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
当我将这些行提取到 java Date 对象中时,我得到两个相同的日期,显示 2:00 CET。更重要的是 - 当我在 MySQL 中获取这些行时,我在 MySQL 中再次得到错误的值:
mysql> SELECT UNIX_TIMESTAMP(timestamp_column) from tab;
+--------------------+
| UNIX_TIMESTAMP(ts) |
+--------------------+
| 1351386000 |
| 1351386000 |
+--------------------+
2 rows in set (0.00 sec)
所以 TIMESTAMP 在我看来没什么用。