C# 在应用程序中管理时区和位置感知时间?
在使用SQL server作为后端的应用程序(Silverlight client-server-SQL server DB)中,我需要进行各种计算并在不同的时区显示时间。我需要在客户端、服务器端和数据库端进行计算 这是一个我同时需要不同时区的应用程序,它不是典型的“本地与UTC” 所有数据将以UTC格式存储,但我需要转换为: 1.定位时间 2.用户时间 所以,假设我们谈论的是航空旅行——我将以UTC存储时间,但用户将在出发/到达时区看到它们 我正在寻找最佳实践,如果我在如何实现这一点上有错误,也许可以纠正我:C# 在应用程序中管理时区和位置感知时间?,c#,.net,sql-server,silverlight,C#,.net,Sql Server,Silverlight,在使用SQL server作为后端的应用程序(Silverlight client-server-SQL server DB)中,我需要进行各种计算并在不同的时区显示时间。我需要在客户端、服务器端和数据库端进行计算 这是一个我同时需要不同时区的应用程序,它不是典型的“本地与UTC” 所有数据将以UTC格式存储,但我需要转换为: 1.定位时间 2.用户时间 所以,假设我们谈论的是航空旅行——我将以UTC存储时间,但用户将在出发/到达时区看到它们 我正在寻找最佳实践,如果我在如何实现这一点上有错误,
DateTime
和TimeZoneInfo
功能完成如何在数据库和应用程序中管理此类信息 正如djacobson提到的,最好的办法是将转换从DB中推出。将时间存储为数据库中的UTC。要求客户端进行时区转换,并且仅在UTC时间与服务器通信,以简化服务器的任务。如果服务器出于某种原因确实需要知道时区的日期,请让客户端或服务传递一个offset参数和DT参数,以便服务器可以将其用作修饰符并仍然使用UTC时间。我喜欢传递调整DT参数以使其达到UTC所需的分钟数,但也有其他同样有效的方法,只要您确保一致地处理请求 下面是我最近参与的一个项目中的一个简化示例,该项目是一个面向移动设备的会议调度应用程序。UTC-6中的客户请求2011年11月20日开始的所有会议将通过
minutesLoadJustby=360
和StartDate={11/16/2011}
。带宽要求决定服务器执行过滤。服务器应用程序将从数据库中获取此客户端的所有记录,然后通过检查record.MeetingDate.AddMinutes(minutesLoadJustby.Date==StartDate.Date
,过滤掉未命中的记录。将通过此检查的所有记录返回给客户,而不更改返回数据;i、 例如,会议日期仍为UTC。这避免了在转换到UTC或从UTC转换到UTC时移动日历日期的问题,并允许后端不知道实际时区
顺便说一句,我的示例中的性能可以通过在请求日期的任何一个日历日内对数据库查询所有StartDate
的客户端记录来提高,以便显著减少获取的记录数
编辑:我误解了我最初回答中的问题,并挂断了转换发生在何处的问题。我留下上面的内容,因为它与如何处理转换相关,但它不能正确回答这个问题
如果您愿意相信客户的系统将具有正确的(更重要的是,所有系统都具有相同的)时区注册表项并支持此方法,则可以存储和传递出发和到达时区的TimeZoneInfo.Id
,并使用TimeZoneInfo.FindSystemTimeZoneById()
在客户端转换期间。它给客户带来了很大的信任,但影响很小
如果您愿意信任外部服务,您可以像上面一样存储目标和到达TZ ID,然后调用服务客户端(或服务器端,如果绝对必要)以获取所需信息。看
如果这两种方法都不可取,那么您可能会陷入制作自己的时区表并将其缓存在服务中的困境,正如您在问题中提到的那样。同样,这里您可以遵循相同的基本设计:存储两个TZ ID,并让客户机从服务获取所需的信息以完成工作 如果“所有数据都将存储在UTC中”,您当然可以将所有转换推出到您的客户机/服务层,并避免编写TSQL或CLR时间转换函数?正确。但我很确定我必须在服务器端进行这种转换。数据导出,可能是报告数据篡改,等等汉克斯,我误解了你的问题。一旦我想出了更有用的东西,我会编辑我的答案。我删除了以前所有的评论。就TimeZoneInfo而言,它无法工作,因为它是Silverlight,我无法访问时区信息。似乎我需要模仿TimeZoneInfo功能,并将时区信息保存在数据库中。我确实有Zip数据,所以我自己可以很容易地将位置匹配到时区,而不必担心API@katitSilverlight,至少在版本3和版本4中。是否存在其他限制?是的,它只支持本地/UTC转换。这里有一些挑战: