存储事件时间,UTC在DST时发出

时间:2015-04-27 15:09:08

标签: java database timezone utc

我在询问之前搜索了这个,但找不到任何有用的东西。我有一台使用UTC的服务器,客户端可以设置服务器每天执行的事件的时间(这是一个简化)。例如,法国有人希望在当地时间23:00(世界标准时间22:00)发生事件。我将其转换为UTC并存储它;服务器每天22:00 UTC愉快地执行。然后到了夏天,现在与法国的偏差是+ 2h,服务器仍然在22:00 UTC执行,但对于用户来说这是错误的时间,法国的22:00 UTC现在是当地时间00:00。

我以UTC格式存储,因为每个人都说要以UTC格式存储并在输出给用户时转换为本地时间,很好,但这对用户来说并不像预期的那样工作。我想我应该存储类似23:00法国时间的东西,服务器应该接受并说“好的,这是今天22:00 UTC”或者好,今天是21:00 UTC因为DST“(我正在使用Java)与JodaTime BTW),但这与大家所说的如何在数据库中以UTC格式存储它相矛盾...所以...我能做什么/应该做什么?

如果我用偏移量存储本地时间和日期,当我读取它时(在使用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时间(2015年4月27日法国时间21:00 UTC为23:00,服务器可以在该UTC时间执行此事件。

谢谢, 加布里埃尔

1 个答案:

答案 0 :(得分:3)

如果您想要代表重复的事件,您肯定需要存储本地时间和时区,并存储或决定如果该时间变为无效或该怎么做的策略或暧昧。 (假设用户存储02:30 - 在春天,当时钟前进时,值根本不会发生,而在秋天,当时钟返回时它会发生两次。)

但如果你有重复的事件,你可能不应该存储DateTime - 我会存储类似于"开始日期" (应该发生的第一个日期; LocalDate),每天应该发生的时间(LocalTime)和时区ID(例如Europe/Paris

存储"当地日期/时间和时区"如果您要存储未来事件,也可能很重要,请记住时区规则可以在现在和之后发生变化。

如果符合以下条件,则存储UTC时刻非常有用:

  • 原始时区不再相关(如果它已存在)
  • 事件未重复
  • 您希望能够轻松地比较事件

这与时间戳特别相关。

但是,是的,就像日期/时间处理中的大多数事情一样,一个简单的"一个尺寸适合所有"答案不存在 - 你需要考虑你的背景。

相关问题