【发布时间】:2012-07-17 05:40:48
【问题描述】:
一般来说,最好的做法是使用 UTC 存储时间,如 here 和 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,如果转换为 10 月 10 日-2012(时区 DST 开启的日期)将导致下午 6 点,这不是正确的结束时间。
我能想到的一种可能方法是将夏令时时间存储在附加列中,并在时区开启夏令时时使用该时间。
方法二: 但是,如果它存储为本地时间,例如对于事件 ABC,它在任何日期将始终为 17:00,因为没有从 UTC 转换为本地时间。
Event LocalEndTime
=======================
ABC 17:00:00
MNO 16:00:00
PQR 14:00:00
应用层将本地时间转换为UTC时间,通过(API GetEndTimeByEvent)发送给其他系统。
在这种情况下,以 UTC 格式存储时间仍然是个好主意吗?如果是,那么如何获得恒定的当地时间?
【问题讨论】:
-
程序是否只用于此类事件?它是否需要为 DST 更改时发生的事件提供服务?程序是否应该处理不断变化的时区?
-
@Michal 是的,所有事件始终是特定本地时区的本地时间(即下午 4 点或晚上 9 点等),无论 DST 是打开还是关闭。假设特定事件“MNO”在伦敦当地时间每天下午 4 点发生,无论 DST 是打开还是关闭。
标签: date time timezone utc dst