gpt4 book ai didi

c# - JsonConvert 不转换 UTC -> PopulateObject 中的本地时间

转载 作者:行者123 更新时间:2023-11-30 14:56:28 25 4
gpt4 key购买 nike

我有一个通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com