0

我想确切地知道在查询数据库时将日期作为参数处理的正确方法是什么。我的数据库托管在 Windows Azure 中,并且我有一个表Job作为Modified具有DateTime数据类型的字段。以DateTimeUTC 格式存储在数据库中。

我想根据Modified日期查询作业列表。用户将输入开始和结束日期,但它们基于不同的时区。查询数据库时如何处理日期以与数据完全匹配?

我正在使用 ASP.Net MVC。我还需要确保考虑夏令时。

我知道我不能简单地编写如下查询:

var data = _context.Jobs
                   .Where(c => c.Modified >= startDate && c.Modified <= endDate);
4

2 回答 2

0

有几种不同的方法可以处理这个问题。首先,您通过将Job.Modified日期存储为 UTC 来做正确的事情。所以不要改变它。:)

方法#1

  • 询问用户他们的时区,通常在应用程序的某种“首选项”或“设置”页面中。
  • 如果您想坚持使用 Windows 时区,您可以从TimeZoneInfo.GetSystemTimeZones. 但就我个人而言,我不喜欢使用 Windows 区域,因为它们有点专有(请参阅时区标签 wiki)。相反,我更喜欢让用户使用地图选择他们的 IANA 时区,并使用 JavaScript 控件,例如this one
  • 如果您使用 IANA 区域,则可以使用jsTimeZoneDetect来猜测用户的时区。这只是一个猜测,所以它可以是默认选择。但不要将用户锁定在其中。他们应该能够改变它。
  • 由于您知道时区,您可以使用TimeZoneInfoNoda Time在服务器上将其输入转换为 UTC,然后使用 UTC 进行查询。
  • 优点: 可以在任何时区工作;不依赖于计算机的时区设置。
  • 缺点:很多额外的 JavaScript。需要更多的用户输入。需要更多的服务器端代码。可能依赖第三方库。

方法#2

  • 使用 JavaScript 将文本输入解析为实际的 JavaScriptDate对象。
  • 您可能需要考虑在解析时使用moment.js以获得更高的灵活性,但这是可选的。
  • Date从or实例中获取 UTC 时间moment,并将其传递给您的服务器。
  • 由于输入时间现在采用 UTC,因此您可以直接在查询中使用它。
  • 优点: 时区选择无需额外的用户参与。不需要额外的库(尽管有些是可选的)。
  • 缺点: 仍然需要一些 JavaScript。只能在用户计算机上设置的本地时区工作。对于夏令时转换附近的某些过去日期,值可能会被错误地转换。
于 2013-07-24T17:45:32.350 回答
0

这是一个难题,因为用户的浏览器可能不会报告正确的时间或时区,但假设您可以相信...

...这仍然是一个难题,因为您需要将他们在本地时区输入的时间转换为 UTC,这不仅需要知道他们的时区偏移量(这很容易从浏览器中获取),还包括他们所在的实际时区因此您可以为夏令时应用适当的偏移量,也可以不为他们输入的日期时间而不是“现在”应用适当的偏移量。

链接可能会帮助您确定浏览器的时区,对于基于时区的实际计算,您应该查看 Jon Skeet 的Noda时间库。

大多数人关注夏令时问题并使用浏览器的时区偏移量来调整输入的日期时间值,并假设在查询旧数据时您不关心一小时的错误(或者将查询扩展一小时以包含它无论如何)。

于 2013-07-24T01:15:58.780 回答