关于时区:在MySql中检测日期是否为夏令时

Detect if a date is in Daylight saving time in MySql

我继承了遗留应用程序,其中所有日期和时间都存储在本地时区(英国)。 我无法改变这些存储的方式。

但是,要求是在应用程序中显示GMT中的所有日期。 因此,当我从数据库中检索事件列表时,我需要它以这种时间格式显示它们,同时观察每个特定事件日期是否正在运行夏令时。 使用以下逻辑,我可以确定查询中的夏令时是否处于活动状态:

1
2
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。

请注意,只有居住在格林威治附近的人希望他们的时间显示在GMT中。:)

祝好运。


发现一个丑陋复杂的方式,@ DT输入日期和时间

1
2
3
4
5
6
7
Set @DT=20150329020304; # -> 0

Set @DT=20150329030304; # -> 1(-0.0511)

Set @DT=20150329040304; # -> 1(-1)

Select 0!=(UNIX_TIMESTAMP(@DT)-   UNIX_TIMESTAMP(Concat(Year(@DT),'0101',Time_Format(@DT,'%H%i%s')))-DateDiff(@DT,Concat(Year(@DT),'0101',Time_Format(@DT,'%H%i%s')))*86400)/3600 as DlsIsOn


你在英国。 所以,你的TZ应该是CET或CEST(中欧夏令时)。 您可以通过这种方式获取信息:

1
2
3
4
5
6
mysql> SELECT @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| CEST               |
+--------------------+

我在许多存储过程中使用它。 注意:我需要两种形式的TZ信息,无论是否需要使用DST计算偏移量。

1
2
3
4
5
6
CASE @@system_time_zone
  WHEN 'CET'  THEN SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
  WHEN 'CEST' THEN SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
  WHEN 'SGT'  THEN SET l_tz = 'Asia/Singapore'; SET l_tzOff = '+8:00';
  ELSE             SET l_tz = 'Europe/Paris';   SET l_tzOff = '+1:00';
END CASE;

你可以从中获得灵感。