当前位置: 首页 > 知识库问答 >
问题:

如何用正确的时区存储时间?(来自Java)

空夕
2023-03-14

我使用的是MySQL5.0。我需要在一个列中存储日期-时间信息。我的意思是使用datetimetimestamp列类型。但我对夏冬转换有意见。

... -> 1:00 CEST -> 2:00 CEST -> 2:00 CET (= 3:00 CEST) -> 3:00 CET -> ...
Date d1 = new Date(1351382400000); // 2:00 CEST (summer-time)
Date d2 = new Date(1351386000000); // 2:00 CET (winter-time)
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对象中时,我得到两个相同的日期,显示CET 2:00。而且,当我在MySQL中获取这些行时,我在MySQL中再次得到错误的值:

mysql> SELECT UNIX_TIMESTAMP(timestamp_column) from tab;
+--------------------+
| UNIX_TIMESTAMP(ts) |
+--------------------+
|         1351386000 | 
|         1351386000 | 
+--------------------+
2 rows in set (0.00 sec)

所以时间戳在我看来没什么用。

共有1个答案

阎咏思
2023-03-14

在我看来,您最好的方法是告诉MySQL使用GMT并在应用程序代码中处理所有本地时间问题,而不是数据库。数据库中的值将始终是GMT,句号,这是明确的。正如您所说的,通过夏令时(夏令时)的调整,您可以在数据库中得到相同的值,对于我们人类来说,这是两个不同的时间。

这也使得数据库具有可移植性。如果您搬到北美并开始使用设置为(比方说)中央时间的MySQL,那么突然之间,您数据库中的值似乎移动了几个小时。我继承的数据库使用的是服务器的本地时间。当我把它从美国东海岸移到西海岸时,没有想到要检查MySQL是否设置为使用机器的区域。

 类似资料:
  • 所以我当前处于“America/Los_Angeles”时区(PDT)中,但是当我创建一个新的moment对象并通过moment tz将其时区设置为我所在的时区('America/Los_Angeles'),如下所示: 错误的时间被返回。具体来说就是提前8个小时。所有其他时区也会出现这种情况。 我是不是从根本上误解了这是怎么工作的? 谢谢你的帮助!

  • 我有一个简单的问题: 输出:(我的时区是ICT) 问题是:日历在 DST 日返回此时区的错误时间。时区“美国/圣地亚哥”现在应该是UTC-3(参考:http://www.timeanddate.com/worldclock/chile/santiago)。它需要显示:

  • 问题内容: 让我解释一下:我并不是在问将特定日期时间的时区存储在数据库中的正确方法。我说的是时区本身。例如: 我有一个名为“用户”的MySQL表。现在,在此表上,我希望有一列包含用户居住地的时区(由用户提供,将从列表中选择)。我正在使用PHP,其中包含类似以下时区字符串的列表: 美国时区列表 现在,显而易见的解决方案(至少对我而言)是在“用户”表中创建VARCHAR列,然后将PHP使用的时区字符串

  • 问题内容: 如何配置JPA /hibernate模式以UTC(GMT)时区在数据库中存储日期/时间?考虑以下带注释的JPA实体: 如果日期是太平洋标准时间(PST)2018-Feb-03 9:30 am,那么我希望数据库中存储2008-Feb-03 5:30 pm的UTC时间。同样,从数据库中检索日期时,我希望将其解释为UTC。因此,在这种情况下,530pm是UTC 530pm。显示时,它将被格式

  • 问题内容: 我有数千张在坦桑尼亚拍摄的照片,我想将每张照片的日期和时间存储在MySQL数据库中。但是,该服务器位于美国,当我尝试存储坦桑尼亚的日期时间(在美国的Spring夏时制时间)处于“无效”小时之内时,我遇到了问题。坦桑尼亚不执行夏令时,因此该时间实际上是有效时间。 其他复杂情况是,来自许多不同时区的协作者将需要访问存储在数据库中的日期时间值。我希望他们 总是 以坦桑尼亚的时间出现,而不是出

  • 问题内容: 我有一个关于mysql时区的怪异问题。 在我的网站配置文件中,我这一行设置了时区: 有趣的是,如果我在此之后添加另一行,例如: 执行该代码后,时间将正确显示。 但是,在其他一些查询中,我在表中插入行,这些表的列名为date,默认为CURRENT_TIMESTAMP。 这样插入行: (“会话”表的列默认为CURRENT_TIMESTAMP) 但是插入到数据库中的值仍指向服务器的时区:((