一般来说,最好的做法是在 UTC 中存储时间,如此处和此处所述。
假设有一个重复发生的事件,假设结束时间总是在同一本地时间,假设 17:00,无论该时区是否开启或关闭夏令时。并且还要求在特定时区的 DST 打开或关闭时不要手动更改时间。还要求任何其他系统通过 API(即 GetEndTimeByEvent)询问结束时间时,它总是以 UTC 格式发送结束时间。
方法 1: 如果决定以 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 存储时间?