Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用程序中管理时区和位置感知时间?_C#_.net_Sql Server_Silverlight - Fatal编程技术网

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

C# 在应用程序中管理时区和位置感知时间?,c#,.net,sql-server,silverlight,C#,.net,Sql Server,Silverlight,在使用SQL server作为后端的应用程序(Silverlight client-server-SQL server DB)中,我需要进行各种计算并在不同的时区显示时间。我需要在客户端、服务器端和数据库端进行计算 这是一个我同时需要不同时区的应用程序,它不是典型的“本地与UTC” 所有数据将以UTC格式存储,但我需要转换为: 1.定位时间 2.用户时间 所以,假设我们谈论的是航空旅行——我将以UTC存储时间,但用户将在出发/到达时区看到它们 我正在寻找最佳实践,如果我在如何实现这一点上有错误,

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

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

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

我正在寻找最佳实践,如果我在如何实现这一点上有错误,也许可以纠正我:

  • 数据库将有“时区”表,其中包含诸如时区名称、id、时间偏移等信息,并且该区域是否遵守DST
  • 数据库中的用户和位置将链接到时区
  • 在客户端和服务器(.NET)上,我将加载时区表并将其缓存在共享的DateTimeService中。这样,我将能够在需要时绑定UI,并在一个中心位置执行所有需要的转换
  • 用户界面/服务器上的计算将通过.NET内置的
    DateTime
    TimeZoneInfo
    功能完成
  • 困扰我的是,我必须在SQL Server和.NET上执行两组不同的功能才能进行转换。我不想在SQL Server中使用CLR代码。很可能我会在T-SQL中手动编写时间转换函数,我会让TimeZoneInfo在.NET端为我工作

    此外,我还必须在DB中的任何地方执行FK,其中我引用了时区表。这将导致其他问题,如不断加入等


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

    正如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转换。这里有一些挑战: