我继承了一个旧应用程序,其中所有日期和时间都存储在本地时区(UK)中。我无权更改这些存储方式。
但是,要求是在应用内以格林尼治标准时间显示所有日期。因此,当我从数据库中检索事件列表时,我需要它以这种时间格式显示所有事件,同时观察每个特定事件日期的夏令时是否正在运行。使用以下逻辑,我可以确定查询中的夏令时是否处于活动状态:
IF(CAST(TIMEDIFF(NOW(), UTC_TIMESTAMP()) AS SIGNED) >0,
DATE_FORMAT(CONVERT_TZ(ADDTIME(`event_date`, IFNULL(`event_time`, '00:00')), '+01:00', '+00:00'), '%H:%i'), `event_time`) AS event_time
然而,这显然只是检查运行日期。因此,将来任何跨越夏时制的事件均不起作用。
有没有一种方法可以检测给定日期是否在mysql查询本身的DST中?
任何帮助,不胜感激。
时区未存储在DATETIME值中。有趣的是,它们用于TIMESTAMP。
鉴于已存储的日期,您可以根据本地规则来确定当时DST是否处于“开启”状态。由于您无法更改日期,因此我想您无法添加一列来存储时区...
创建一个包含规则的存储过程,并将给定日期转换为GMT。
请注意,只有格林威治附近的人希望在格林尼治标准时间显示他们的时间。 :)
祝你好运。>>
您在英国。因此,您的TZ应该是CET或CEST(中欧夏季时间)。您可以通过以下方式获取信息:
发现了一个丑陋的复杂方式,@ DT输入了日期和时间
SELECT IF(ROUND(TIME_TO_SEC(SUBTIME(TIME(SYSDATE()), UTC_TIME())) / 3600, 0) = 2
, 'summer time', 'winter time') AS time;