C# JSONVERT不转换UTC->;PopulateObject中的本地时间
我有一个日期是通过toJSON从javascript获得的,因此它存储为UTC时间,但我想将其存储在数据库中作为本地时间(我们过去从未存储过UTC时间,所以我需要在这里继续这个趋势) 但是,在运行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日期 我的问题是:为什么它没有运行解决问题的
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)