【问题标题】:Managing Time Zones and location aware times in application?在应用程序中管理时区和位置感知时间?
【发布时间】:2011-11-21 20:46:39
【问题描述】:

在以 SQL Server 作为后端的应用程序(Silverlight 客户端 - 服务器 - SQL Server DB)中,我需要在不同时区进行各种计算和显示时间。我需要在客户端、服务器和数据库端进行计算。

这是我同时需要不同时区的应用程序,它不是典型的“本地 vs UTC” 所有数据都将以 UTC 格式存储,但我需要转换为: 1.定位时间 2.用户时间

因此,假设我们谈论航空旅行 - 我将以 UTC 存储时间,但用户会在出发/到达时区看到它们。

我正在寻找最佳做法,如果我在处理方法上有错误,也许可以纠正我:

  1. 数据库将包含“TimeZones”表,其中包含时区名称、ID、时间偏移等信息,并且该区域是否遵守 DST
  2. 数据库中的用户和位置将链接到时区
  3. 在客户端和服务器 (.NET) 上,我将加载 TimeZones 表并将其缓存在我的共享 DateTimeService 中。这样我就可以在需要时绑定 UI,并在一个中心位置完成我需要的所有转换
  4. UI/服务器上的计算将使用 .NET 的内置 DateTimeTimeZoneInfo 功能完成

困扰我的是,我必须在 SQL Server 和 .NET 上执行 2 组不同的功能才能进行转换。我不想在 SQL Server 中使用 CLR 代码。我很可能会在 T-SQL 中手动编码时间转换函数,并且我会让 TimeZoneInfo 在 .NET 端为我工作。

此外,我将不得不在我引用 TImeZOne 表的数据库中的任何地方进行 FK。这将导致其他问题,例如不断加入等。

您如何管理数据库和应用程序中的此类信息?

【问题讨论】:

  • 如果“所有数据都将存储在 UTC 中”,您肯定可以将所有转换推送到您的客户端/服务层,而不必编写 TSQL 或 CLR 时间转换函数吗?
  • 正确。但我很确定我必须在服务器端进行这种转换。数据导出,可能是报表数据按摩等

标签: c# .net sql-server silverlight


【解决方案1】:

正如 djacobson 所说,最好的办法是将转换从您的数据库中推出。将时间作为 UTC 存储在数据库中。要求客户端进行时区转换,并且只在 UTC 时间与服务器通信,以简化服务器的任务。如果服务器出于某种原因确实需要知道时区的日期,请让客户端或服务将偏移参数与 DT 参数一起传递,以便服务器可以将其用作修饰符并仍然使用 UTC 时间。我喜欢传递调整 DT 参数以使其达到 UTC 所需的分钟数,但还有其他同样有效的方法可以做到这一点,只要您确保一致地处理请求。

这是我最近参与的一个项目的简化示例,该项目是针对移动设备的会议安排应用程序。 UTC -6 中的客户端请求从 2011 年 11 月 20 日开始的所有会议将通过 MinutesToAdjustBy = 360StartDate = {11/16/2011}。带宽要求规定服务器执行过滤。服务器应用程序将从数据库中获取该客户端的所有记录,然后通过检查record.MeetingDate.AddMinutes(MinutesToAdjustBy).Date == StartDate.Date 过滤掉未命中的记录。将所有通过此检查的记录返回给客户端,而不更改返回数据;即,MeetingDate 仍为 UTC。这样可以避免在转换为 UTC 或从 UTC 转换日历日期的问题,并允许您的后端不知道实际时区。

顺便说一句,我的示例中的性能可以通过在请求日期后的 1 个日历日内查询数据库中带有 StartDate 的所有客户记录来提高,以显着减少获取的记录数量。

编辑:我在最初的回答中误解了这个问题,并在转换发生在哪里的问题上挂断了电话。我将离开上述内容,因为它与如何处理转换的问题有关,但它没有正确回答问题。

如果您愿意相信您的客户系统将具有正确的(更重要的是,所有系统都具有相同的)时区注册表项并支持此方法,您可以为两者存储并传递 TimeZoneInfo.Id出发和到达时区,并在客户端转换期间使用TimeZoneInfo.FindSystemTimeZoneById()。它非常信任客户,但影响却很小。

如果您愿意信任外部服务,您可以像上面一样存储目的地和到达 TZ ID,然后调用服务客户端(或服务器端,如果绝对必要)以获取所需信息。见this question

如果这些都不是可口的,那么您可能无法制作自己的时区表并将其缓存在您的服务中,正如您在问题中提到的那样。同样,在这里您可以遵循相同的基本设计:存储两个 TZ ID,并让客户端从服务中获取所需的信息以完成工作。

【讨论】:

  • 谢谢,我误解了你的问题。一旦我想出更有帮助的东西,我会编辑我的答案。
  • 我删除了我之前的所有 cmets。就 TimeZoneInfo 而言 - 它不会仅仅因为它是 Silverlight 而我无法访问 TimeZone 信息。看来我需要模仿 TimeZoneInfo 功能并将 TimeZone 的东西保存在数据库中。
  • 我确实有 Zip 数据,所以我可以很容易地将位置与时区匹配,无需 API
  • @katit Silverlight does appear to support the TimeZoneInfo class,至少在版本 3 和 4 中。还有其他限制吗?
  • 是的,它只支持本地/UTC 转换。这里有一些挑战:stackoverflow.com/questions/4618107/…
猜你喜欢
  • 1970-01-01
  • 2014-03-20
  • 2016-10-06
  • 2019-01-02
  • 2012-04-15
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
相关资源
最近更新 更多