存储事件时间,UTC 在 DST 时发布
Storing event times, UTC issues when DST
我在询问之前搜索过此内容,但找不到任何有用的信息。我有一台使用 UTC 的服务器,客户端可以设置服务器每天执行的事件的时间(这是一种简化)。例如,法国的某个人希望事件发生在 23:00 当地时间(22:00 UTC)。我将其转换为 UTC 并存储;服务器每天在 22:00 UTC 愉快地执行。然后到了夏天,现在与法国的偏移量是 +2h,服务器仍然在 22:00 UTC 执行,但对于用户来说这是错误的时间,因为法国的 22:00 UTC 现在是 00:00 本地时间.
我存储为UTC,因为大家都说存储为UTC,输出给用户时转换为本地时间,好吧,但这对用户来说并没有达到预期的效果。我想我应该存储像 23:00 法国时间这样的东西,服务器应该接受它并说 "ok, this is 22:00 UTC today" 或好的,由于 DST,今天是 21:00 UTC”(我正在使用 Java 与 JodaTime 顺便说一句),但这与每个人所说的我应该如何将它存储在数据库中的 UTC 相矛盾......所以......我做什么 can/should?
如果我用偏移量存储本地时间和日期,当我读取它时(在使用 UTC 的服务器上)我会:
DateTime dbLocalHistoricDateTime = fromDB(); // suppose this 23:00 in France on the 01.01.2015 (UTC+1), 22:00 UTC on that date
DateTimeZone localZone = dbLocalHistoricDateTime.getZone();
DateTime currentLocalDateTime = DateTime.now().withZone(localZone);
DateTime localToday = dbLocalHistoricDateTime.withDate(currentLocalDateTime.getYear(), currentLocalDateTime.getMonthOfYear(), currentLocalDateTime.getDayOfMonth());
DateTime utcToday = localToday.withZone(DateTimeZone.UTC);
然后 utcToday 包含今天的正确 UTC 时间(21:00 UTC 在 2015 年 4 月 27 日在法国 23:00,然后服务器可以在该 UTC 时间执行此事件。
谢谢,
加布里埃尔
如果你想表示一个repeated事件,你肯定需要存储本地时间和时区,并且存储或决定如果发生该怎么做的策略那个时间变得无效或模棱两可。 (假设用户存储 02:30 - 在 spring 中,当时钟向前时,该值根本不会出现,而在秋天,当时钟向后时,它会出现两次。)
但是如果你有一个重复的事件,你可能不应该存储 DateTime
无论如何 - 我会存储类似 "start date" 的东西(它应该发生的第一个日期; a LocalDate
),每天应该发生的时间 (a LocalTime
) 和时区 ID(例如 Europe/Paris
)。
如果您要存储未来的事件,存储 "local date/time and time zone" 也很重要,请记住时区规则可能会随时更改。
在以下情况下存储 UTC 时刻很有用:
- 原来的时区不再相关(如果它存在的话)
- 事件不再重复
- 您想能够真正轻松地比较事件
这与时间戳特别相关。
但是,就像 date/time 处理中的大多数事情一样,不存在简单的 "one size fits all" 答案 - 您需要考虑您的上下文。
我在询问之前搜索过此内容,但找不到任何有用的信息。我有一台使用 UTC 的服务器,客户端可以设置服务器每天执行的事件的时间(这是一种简化)。例如,法国的某个人希望事件发生在 23:00 当地时间(22:00 UTC)。我将其转换为 UTC 并存储;服务器每天在 22:00 UTC 愉快地执行。然后到了夏天,现在与法国的偏移量是 +2h,服务器仍然在 22:00 UTC 执行,但对于用户来说这是错误的时间,因为法国的 22:00 UTC 现在是 00:00 本地时间.
我存储为UTC,因为大家都说存储为UTC,输出给用户时转换为本地时间,好吧,但这对用户来说并没有达到预期的效果。我想我应该存储像 23:00 法国时间这样的东西,服务器应该接受它并说 "ok, this is 22:00 UTC today" 或好的,由于 DST,今天是 21:00 UTC”(我正在使用 Java 与 JodaTime 顺便说一句),但这与每个人所说的我应该如何将它存储在数据库中的 UTC 相矛盾......所以......我做什么 can/should?
如果我用偏移量存储本地时间和日期,当我读取它时(在使用 UTC 的服务器上)我会:
DateTime dbLocalHistoricDateTime = fromDB(); // suppose this 23:00 in France on the 01.01.2015 (UTC+1), 22:00 UTC on that date
DateTimeZone localZone = dbLocalHistoricDateTime.getZone();
DateTime currentLocalDateTime = DateTime.now().withZone(localZone);
DateTime localToday = dbLocalHistoricDateTime.withDate(currentLocalDateTime.getYear(), currentLocalDateTime.getMonthOfYear(), currentLocalDateTime.getDayOfMonth());
DateTime utcToday = localToday.withZone(DateTimeZone.UTC);
然后 utcToday 包含今天的正确 UTC 时间(21:00 UTC 在 2015 年 4 月 27 日在法国 23:00,然后服务器可以在该 UTC 时间执行此事件。
谢谢, 加布里埃尔
如果你想表示一个repeated事件,你肯定需要存储本地时间和时区,并且存储或决定如果发生该怎么做的策略那个时间变得无效或模棱两可。 (假设用户存储 02:30 - 在 spring 中,当时钟向前时,该值根本不会出现,而在秋天,当时钟向后时,它会出现两次。)
但是如果你有一个重复的事件,你可能不应该存储 DateTime
无论如何 - 我会存储类似 "start date" 的东西(它应该发生的第一个日期; a LocalDate
),每天应该发生的时间 (a LocalTime
) 和时区 ID(例如 Europe/Paris
)。
如果您要存储未来的事件,存储 "local date/time and time zone" 也很重要,请记住时区规则可能会随时更改。
在以下情况下存储 UTC 时刻很有用:
- 原来的时区不再相关(如果它存在的话)
- 事件不再重复
- 您想能够真正轻松地比较事件
这与时间戳特别相关。
但是,就像 date/time 处理中的大多数事情一样,不存在简单的 "one size fits all" 答案 - 您需要考虑您的上下文。