我需要在MySQL中进行日期时间转换。如何确定客户的时区?

时间:2011-07-12 12:00:02

标签: mysql datetime timezone

我将尝试解释我的目标,我正在努力实现的目标以及为什么对我没有任何作用: 我需要将DATETIME存储在MYSQL表中。客户端应该能够以两种方式检索DATETIME:

  1. 如果user1以时区UTC + 2添加日期时间2011-07-12 00:00:00,然后timeZone为UTC-3的user2检索此值,则应获取datetime 2011-07-11 19 :00:00。 DST在这里非常重要。
  2. 如果user1添加了日期时间2011-07-12 00:00:00,则user2获取完全相同的日期
  3. 这就是我不再需要了。但我找不到如何做的方式......

    我想到的是将日期存储在user1时区中,如果使用第二种方法,则根本不执行任何转换。问题在于第一种方法。我想我可以使用CONVERT_TZ()函数,但我应该使用什么作为时区参数?在我看来,mysql.time_zone_name表中的时区列表完全混乱。让用户从这个凌乱的列表中选择他的时区是否实用?例如,我应该使用什么:欧洲/ Warshava或波兰?如果我住在克莱佩达市(欧洲,立陶宛),我应该选择时区欧洲/维尔纽斯吗?为什么这些名字如此复杂?也许有其他MySQL表使用某种标准化的名称,如UTC + 02:00宽度DST和没有,就像在Wondows操作系统(伤心我没有机会与其他操作系统进行比较)?我可以使用时区“+02:00”的偏移量,如有记录,但不保留DST信息。或者有可能自动确定用户时区?

    希望我明白自己。非常感谢帮助和任何建议。

    [已修改(回复 Flimzy )]

    如果我总是必须转换为用户(客户端)日期,那我认为在UTC中的所有内容都是最好的评估。但是,如果一个用户进入DATETIME 2011.11.12 00:00:00并且另一个用户必须看到完全相同的时间并且他们的时区不匹配,那么呢?所以我决定在存储和存储时区时根本不转换日期。那是我的问题。如何自动确定客户端时区?或者如何让时区名称不那么令人困惑?该设置对我的应用程序非常重要,因此我不想让用户配置它,但如果没有办法,我希望那个时区列表尽可能清晰。

3 个答案:

答案 0 :(得分:1)

每当你处理多个时区时,你应该总是在插入之前将你的时间转换为UTC,然后转换到用户的时区,以便在从数据库中提取时显示。

即使您的用户都没有使用UTC,以UTC格式存储也会大大简化事情。

名称混乱的原因与“UTC + 02:00与DST”相反,DST在同一时区内的不同地区的定义不同。使用来自世界各地的一个例子,美国和墨西哥属于同一时区(“美国中部”),但有不同的DST日期。美国在墨西哥之前大约两周发生变化。所以仅仅说“我在使用DST的GMT-05”是不够的,因为这并不能传达哪些 DST规则适用于我。

有很多地方DST规则比这个例子更复杂。而这种复杂性只是进一步证明将所有内容存储在UTC中会使生活变得简单得多:)

答案 1 :(得分:0)

尝试使用TimeStamp

时间戳也自动存储时区信息(实际内置)。

答案 2 :(得分:0)

我想我会使用这个javascript,然后根据Timezone Detection List使用自定义时区名称建立我自己的列表,如(UTC +02:00)赫尔辛基,基辅,里加,索菲亚,塔林,维尔纽斯等,如果在自动检测过程中出现问题,则保留用户更改时区的能力