Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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_Asp.net Mvc_Sql Server 2008_Datetime - Fatal编程技术网

C# 将任何日期时间从服务器时间转换为用户时间(处理标准时间和夏时制)

C# 将任何日期时间从服务器时间转换为用户时间(处理标准时间和夏时制),c#,.net,asp.net-mvc,sql-server-2008,datetime,C#,.net,Asp.net Mvc,Sql Server 2008,Datetime,我正在使用.NETMVC3和SQLServer2008(r2)开发一个web应用程序 无论如何,我有一个日期时间对象,我想把它转换成用户时间。现在转换为用户时间相当简单;我有一些java脚本,可以让我得到UTC的用户偏移量。我知道我的日期时间偏移到UTC 我昨天意识到,如果我的用户生活在世界上一个令人讨厌的地区,他们的偏移量将会改变。这将导致旧的日期和时间在一定时间内出错 现在我知道C#有一些实用程序可以转换成时区,但它们真的能处理所有复杂的日光节约吗 比如说。如果我有时间的话,10-10-20

我正在使用.NETMVC3和SQLServer2008(r2)开发一个web应用程序

无论如何,我有一个日期时间对象,我想把它转换成用户时间。现在转换为用户时间相当简单;我有一些java脚本,可以让我得到UTC的用户偏移量。我知道我的日期时间偏移到UTC

我昨天意识到,如果我的用户生活在世界上一个令人讨厌的地区,他们的偏移量将会改变。这将导致旧的日期和时间在一定时间内出错

现在我知道C#有一些实用程序可以转换成时区,但它们真的能处理所有复杂的日光节约吗

比如说。如果我有时间的话,10-10-2001 8:00:00我怎样才能把时间输入太平洋时间?或者如果我有6-6-2004,我该如何把它带入太平洋时间

由于翻滚的日期会发生变化,这相当复杂,我希望有一个不需要维护的通用解决方案来设置时区的日期范围

我知道这是CS中的一个经典问题,但我找不到真正100%回答我问题的东西。从我所看到的:C#使用当前年份的daylights储蓄日期来更改每年的日期时间。这可能会导致一些错误

非常感谢你的帮助

现在我知道C#有一些实用程序可以转换成时区,但它们真的能处理所有复杂的日光节约吗

TimeZoneInfo
有,是1。(它是.NET框架的一部分,而不是C的一部分-C只是您碰巧使用的语言。)然而,我认为这不是您真正想要做的

为什么要将
DateTime
存储在服务器的时区中?在大多数情况下,将其存储在UTC中更为明智。除此之外,如果您的服务器位于一个遵守夏令时的时区,那么当时钟倒转时,您每年将有一个小时的模糊性。(同一本地时间发生两次。)

一旦您将其存储为UTC,您也应该将其作为UTC提供给Javascript客户机。虽然您说您有“一些java脚本,可以让我得到用户与UTC的偏移量”-这取决于确切的时间。例如,当我在英国时,我的偏移量有时为0,有时为+1小时。如果您将UTC传递回客户机,则可以从该UTC时间计算出本地时间。您的服务器不能,除非您能够获得从客户端到服务器的时区的准确表示,这通常是一件棘手的事情

从我所看到的:C#使用当前年份的daylights储蓄日期来更改每年的日期时间

同样,C#本身在这里也不相关。不清楚您指的是.NET框架的哪一部分-
时区
<代码>时区信息<代码>日期时间
TimeZoneInfo
具有历史数据,但仅当您使用的是支持该数据的操作系统版本时



1好吧,只要你愿意。它没有TZDB那么多的历史数据,它对俄罗斯和纳米比亚有一些非常奇怪的表述,但它确实有改变规则的想法

我发现以下规则是最好的解决方案:

  • 在服务器端使用UTC。根本不需要处理时区问题。这意味着,若在数据库中存储日期,则使用UTC日期,若在服务器端生成日期,则通常使用UTC(例如:
    var nowDate=DateTime.UtcNow
    服务器日期应该与位置无关,这样就不会产生混淆
  • 在客户端,处理原始数据时也使用UTC,但在UI中显示转换为浏览器本地时间的日期(无论操作系统中配置了什么时间)。 好消息是,这已经是浏览器中的内置功能了!我们只需要让他们更容易处理。 这意味着,如果我们有一个javascript客户端代码将数据发布/放置/修补到服务器,并使用JSON从服务器获取数据,JSON应该使用UTC中的ISO 8601(本机支持)(以Z结尾),就像您在做:

    var dateNow = new Date(); //Wed May 11 2016 13:06:21 GMT+1200 (New Zealand Standard Time)
    var dateNowIso = dateNow.toISOString(); //"2016-05-11T01:06:21.147Z"
    
  • 然后,只需依靠浏览器功能将任何UTC日期自动转换为当前本地时间,反之亦然。只要格式是
    日期
    对象,浏览器的javascript引擎就能够在UI中显示正确的本地时间

    关于如何在.NET服务器和Javascript客户端场景中实现它的注意事项:例如,我在客户端Javascript代码中使用AngularJS(带restangular),在服务器端使用MVC 6(ASP.NET Core 1.0)

    来自服务器的JSON可能包含日期属性,但在JSON中,类型是一个字符串,例如:

    {
      "myDateField":"2016-05-11T05:00:00Z"
    }
    
    为了依靠浏览器的功能正确处理UTC时间并将其转换为本地浏览器的时间,我需要将此UTC日期字符串解析为真实的javascript日期对象,因此我使用正则表达式匹配任何类似ISO 8601格式的UTC日期的文本值(在我的例子中,此代码位于重新启动的响应拦截器中,但它可以位于任何位置):

    这样,我就可以将javascript对象与适当的日期对象一起使用

    在服务器端(MVC6或WebAPI2..),我有一条指令告诉我的JSON解析器在解析日期时始终使用UTC格式,否则它不会在末尾添加Z字符,这一点非常重要。MVC6示例:

    services.AddMvc().AddJsonOptions(opt => {
      // json dates always in javascript date format with UTC e.g: "2014-01-01T23:28:56.782Z"
      opts.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
    });
    
    灵感来自
    更新:在某些情况下,如下面的评论中所述,在本地时间存储数据可能会很有趣。

    在我以前的工作中,我们使用了一个日历表,该表在我们支持的每个时区中的每个日期都有一行,以及该天与UTC的偏移量。填充给定的夏令时规则非常容易,而且非常简单sy要更新吗
    services.AddMvc().AddJsonOptions(opt => {
      // json dates always in javascript date format with UTC e.g: "2014-01-01T23:28:56.782Z"
      opts.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
    });