0

我假设应用程序代码应始终将时间存储在数据库中作为 UTC(如果我错了就打我)

现在假设我想查询 23-mar-2013 到 24-mar-2013 之间的所有内容。我应该创建一个时间对象,然后查询诸如“23-mar-2013:00:00:00UTC”到“24-mar-2013:24:00:00UTC”之类的东西还是只按日期查询是正确的“23-mar- 2013 年”至“2013 年 3 月 24 日”。

现在,当我不在 UTC 和像 -7:30 这样的时区时,问题就来了。

现在日期查询会出错..

那么这是否意味着我应该随时查询?

我正在谈论 ElasticSearch、Tire、Ruby(但我认为这不重要)

4

1 回答 1

1

实施绝对重要。根据数据库存储日期/时间值的方式,查询一个或另一个数据库非常不同。我建议您编辑您的问题,并使其针对您正在使用的技术。如果可以,请显示一些代码。

不过,总的来说,您混合了两个概念,您可能应该尝试在精神上将它们分开。

  • 发生某事的那一刻,一个事件时间,可以通过 DateTime 组合值来衡量 - 表示为 UTC,或者表示为从已知偏移量的 UTC 偏移的值。这通常被称为“瞬时时间”、“世界时间”或“物理时间”。

  • 我们在本地谈论日期和时间时赋予它们的值,例如“今天”、“昨天”或“2013 年 3 月 29 日”。即使我们有时间,我们也是在谈论日历上一天的一小部分。这通常被称为“日历时间”、“当地时间”或“公民时间”。

您始终可以使用瞬时时间进行查询和数学运算。这是明确的。然而,“今天”的概念毫无意义。没有观察者来标记一天的结束和下一天的开始。(有人可能会说观察者在伦敦,但在 BST 期间并非如此。)

日历时间仅适用于当您具有日级精度且只有一名观察员时的查询或数学。因此,它通常无法很好地表达本应具有普遍性的事物,例如事件。

让我们回到你原来的问题。你说:

我想查询 2013 年 3 月 23 日至 2013 年 3 月 24 日之间的所有内容

就在那里 - 你有问题。上下文是什么?你在说谁的日历日期?即使您说的是 3 月 23 日,但您可能并不是指 3 月 23 日午夜 UTC 到 3 月 24 日午夜 UTC。您可能是指其他日历的午夜。

请记住,并非每一天都是 24 小时。当时区打开和关闭夏令时(或夏令时)时,天的长度可能是 23 小时或 25 小时。

那么该怎么办?首先,您需要一个时区数据库(例如 IANA/Olson/TZ/TZDB/ZoneInfo 数据库) 这是一个用 Ruby 实现的

现在,您需要知道用户的本地时区。那就是 - 提出问题的人,您正在向其展示查询结果。这将涉及您自己的应用程序逻辑,可能是选择器或选择器。如果这是一个 Web 应用程序,您可能想查看这个基于地图的时区选择器,或者查看jsTimeZoneDetect

您应该始终以瞬时时间存储事件。假设您将事件存储为 UTC(尽管您可能使用偏移量,但我们暂时忽略它)。

因此,您需要知道用户想要的日期范围,查询的开始日期和结束日期映射到什么 UTC 时间?例如,假设我们在印度使用Asia/Calcutta时区。我们将23-mar-2013 00:00 - 24-mar-2013 00:00, 转换为 UTC 等效值22-mar-2013 18:30 - 23-mar-2013 18:30

Then you can use those UTC DateTime values to query the database.

When you return the results to your user, you will probably want to convert UTC back to local time so they understand the results they are looking at.

You should also read the many great suggestions in this post.

于 2013-03-29T22:31:44.100 回答