我有一个通过 toJSON 来自 javascript 的日期,所以它存储为 UTC 时间,但我想将它作为本地时间存储在数据库中(我们过去从未存储过 UTC 时间,所以我需要继续这里的趋势)。
但是,在运行 PopulateObject
时设置 DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local
(使用 Newtonsoft.Json 版本 6.0.0.0)不会执行任何操作,它是仍然保留为原始时间的 UTC 日期。
我的问题是:为什么它不运行 dt.ToLocalTime()
来解决问题(并且是我当前的解决方法)- 或者:如果没有,我如何让转换器执行此操作来自 DateTimeZoneHandling.Local
设置?
最佳答案
将 DateTime
作为本地时间存储到数据库中通常不是一个好主意,因为:
如果您本地的时区有 daylight saving time规则,那么您可能会丢失数据。在回退过渡期间,有一个一小时的时间段,其中本地时间可以代表两个可能的时刻。使用 UTC 可避免此问题。
它将您的数据绑定(bind)到特定位置。如果您需要将服务器迁移到另一个位置(或云端),您过去的数据将不准确。
如果您必须以本地时间存储数据,请考虑将其存储为DateTimeOffset
。通过记录偏移量,如果本地时区发生变化,您可以准确区分它所代表的唯一时间点。这足以反驳上述两点。
另请参阅:DateTime
vs DateTimeOffset
.
关于您关于 JSON.Net 和 DateTimeZoneHandling.Local
选项的问题,这个简单的示例表明它似乎按设计工作。我无法重现您的声明。
public class Foo
{
public DateTime DateTime { get; set; }
}
...
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)
我的本地时区是美国太平洋时间,在提供的日期比 UTC 晚 8 小时,这反射(reflect)在结果中。
关于c# - JsonConvert 不转换 UTC -> PopulateObject 中的本地时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22812624/