gpt4 book ai didi

c# - 在应用程序中管理时区和位置感知时间?

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:47 25 4
gpt4 key购买 nike

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

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

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

我正在寻找最佳实践,如果我对如何处理它有误,可能会纠正我:

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

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

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

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

最佳答案

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

这是我最近参与的一个项目的简化示例,该项目是一个针对移动设备的 session 安排应用程序。 UTC -6 中请求所有于 2011 年 11 月 20 日开始的 session 的客户端将传递 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,并让客户端从服务中获取所需的信息以完成工作。

关于c# - 在应用程序中管理时区和位置感知时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8218328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com