实施绝对重要。根据数据库存储日期/时间值的方式,查询一个或另一个数据库非常不同。我建议您编辑您的问题,并使其针对您正在使用的技术。如果可以,请显示一些代码。
不过,总的来说,您混合了两个概念,您可能应该尝试在精神上将它们分开。
您始终可以使用瞬时时间进行查询和数学运算。这是明确的。然而,“今天”的概念毫无意义。没有观察者来标记一天的结束和下一天的开始。(有人可能会说观察者在伦敦,但在 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.