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

标签 c# asp.net json timezone json.net

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

相关文章:

sql - 从具有带键值对的 json 对象的列中查找最大值

c# - 与其他页面相比,在第一页上显示不同的 HTML 标题

c# - 如何在 Visual Studio 中查看下载包的源代码

c# - 使用 Rx 确定鼠标拖动结束的正确方法是什么?

c# - 当某些单元格值为空时对单元格值求和并显示在 asp.net gridview 的页脚中

javascript - 如何在单击 <a> 时模拟单击 LinkBut​​ton?

c# - 如何在 MSIL 中调用正在执行的程序集之外的方法?

c# - System.Drawing 不存在?

json - 如何从 json 中获取图像和 pdf 文件并在 tableviewcell swift 3 中显示

json - 如何使用 scala 中的 json4s 库测试我为解析器创建的案例类是否正确?