一般来说,最好的做法是用 UTC 存储时间,如中所述here and here.
假设有一个重复发生的事件(假设结束时间始终为同一当地时间(假设为 17:00)),无论该时区是否启用夏令时。并且还要求在特定时区的 DST 打开或关闭时不要手动更改时间。还有一个要求是,每当任何其他系统通过 API(即 GetEndTimeByEvent)询问结束时间时,它始终以 UTC 格式发送结束时间。
方法一:如果决定的话以 UTC 存储它可以存储在数据库表中,如下所示。
Event UTCEndTime
=====================
ABC 07:00:00
MNO 06:00:00
PQR 04:00:00
对于第一个事件 ABC,UTC 结束时间为上午 07:00,如果在 2012 年 7 月 1 日转换为从 UTC 显示为当地时间,则结果将显示为 17:00 当地时间,如果在 2012 年 10 月 10 日转换(时区 DST 开启的日期)将导致下午 6 点,这不是正确的结束时间。
我想到的一种可能的方法是将 DST 时间存储在附加列中,并在时区启用 DST 时使用该时间。
方法2:然而,如果是存储为当地时间如下所示,对于事件 ABC,任何日期都将始终为 17:00,因为没有从 UTC 转换为本地时间。
Event LocalEndTime
=======================
ABC 17:00:00
MNO 16:00:00
PQR 14:00:00
应用层将本地时间转换为UTC时间,通过API GetEndTimeByEvent发送给其他系统。
在这种情况下,以 UTC 存储时间仍然是一个好主意吗?如果是,那么如何获得恒定的本地时间?
相关问题:是否有充分的理由不使用 UTC 存储时间?