C# JSONVERT不转换UTC->;PopulateObject中的本地时间

C# JSONVERT不转换UTC->;PopulateObject中的本地时间,c#,asp.net,json,timezone,json.net,C#,Asp.net,Json,Timezone,Json.net,我有一个日期是通过toJSON从javascript获得的,因此它存储为UTC时间,但我想将其存储在数据库中作为本地时间(我们过去从未存储过UTC时间,所以我需要在这里继续这个趋势) 但是,在运行PopulateObject时,设置DateTimeZoneHandling=Newtonsoft.Json.DateTimeZoneHandling.Local(版本为6.0.0.0的Newtonsoft.Json)没有任何作用,它仍然保留为原始时间的UTC日期 我的问题是:为什么它没有运行解决问题的

我有一个日期是通过toJSON从javascript获得的,因此它存储为UTC时间,但我想将其存储在数据库中作为本地时间(我们过去从未存储过UTC时间,所以我需要在这里继续这个趋势)

但是,在运行
PopulateObject
时,设置
DateTimeZoneHandling=Newtonsoft.Json.DateTimeZoneHandling.Local
(版本为6.0.0.0的Newtonsoft.Json)没有任何作用,它仍然保留为原始时间的UTC日期


我的问题是:为什么它没有运行解决问题的
dt.ToLocalTime()
,或者:如果不是通过
DateTimeZoneHandling.Local
设置,如何让转换器实现这一点?

DateTime
存储到数据库中作为本地时间通常不是一个好主意,因为:

  • 如果本地时区有规则,则可能会丢失数据。在回退过渡期间,有一个一小时的时间段,当地时间可以代表两个可能的时刻。使用UTC可以避免此问题

  • 它将数据绑定到特定位置。如果您需要将服务器迁移到其他位置(或云),您过去的数据将不准确

如果您必须将数据存储在本地时间,请考虑将其存储为<代码> DATEMEMPLOOS。通过记录偏移,如果本地时区发生变化,您可以准确区分它所代表的唯一时间点。这足以抵消上述两点

另见:

关于JSON.Net和
DateTimeZoneHandling.Local
选项的问题,这个简单的示例表明它似乎按照设计工作。我不能重复你的说法

public class Foo
{
    public DateTime DateTime { get; set; }
}


我的本地时区是美国太平洋时间,在提供的日期比UTC晚8小时,这反映在结果中。

您能提供代码片段和json片段吗?谢谢您的回复!我知道存储GMT存在一些问题,但感谢您没有让我太容易就解决;)好的,我需要一起得到一个更简单的测试用例。。。或者把它留给解决办法。
var json = "{\"DateTime\":\"2014-01-01T00:00:00.000Z\"}";

var settings = new JsonSerializerSettings
                    {
                        DateTimeZoneHandling = DateTimeZoneHandling.Local
                    };

var foo = JsonConvert.DeserializeObject<Foo>(json, settings);

Debug.WriteLine("{0} ({1})", foo.DateTime, foo.DateTime.Kind);
12/31/2013 16:00:00 (Local)