【问题标题】:JsonConvert ignores DateTime Utc settings?JsonConvert 忽略 DateTime Utc 设置?
【发布时间】:2021-11-24 23:00:42
【问题描述】:

我在 Kind Utc 的这个对象中有一些 DateTime:

Model.Calendar

当我尝试序列化它时:

var calendar = @Html.Raw(JsonConvert.SerializeObject(Model.Calendar, new JsonSerializerSettings
{
  DateTimeZoneHandling = DateTimeZoneHandling.Utc
}));

我看到它忽略了 DateTime Utc。这是日历变量的console.log:

没有+2。 当我获取这个对象并通过 MVC 控制器发回后端时,日历对象的 DateTime 是 Kind Local:

$.ajax({
    url: '@Url.Action("UpdateCalendar")',
    data: { id: @Model.CalendarItem.ID, newCalendar: calendar, selectedMonth: $('.select-month').val() },
    method: 'POST',
    beforeSend: function () {
        ShowLoading();
    },
    success: function (data) {
        //
    },
    error: function (ex) {
        //
    },
    complete: function () {
        //
    }
});

public PartialViewResult UpdateCalendar(long id, List<List<CalendarDay>> newCalendar, int selectedMonth) {
     // here newCalendar's DateTime are Kind Local
}

我猜是序列化的问题吗?我该如何解决?

【问题讨论】:

  • 您为什么期望 UTC DateTime 值(序列化为 UTC)包含 +2 时区偏移量?这听起来更像是一个反序列化问题。
  • @RichardDeeming 你的意思是在接收 newCalendar 对象服务器端时?
  • 是的。您发送给客户端的数据和您显示的设置看起来是正确的。问题似乎是服务器假设从客户端发送的值是Local 值而不是Utc 值。
  • 就我个人而言,我更倾向于使用DateTimeOffset,它应该在您往返客户端时保留时区偏移。或者改用 NodaTime,这将是一项更大的任务。
  • @RichardDeeming 如果我在序列化时删除 DateTimeOffset ,也会出现同样的问题。如何在服务器端修复它?

标签: jquery asp.net-mvc datetime utc


【解决方案1】:

好吧,看看你的 DateTime 对象和 json 输出,一切都按预期工作。您为 2021-01-01 00:00:00 提供了 UTC 时间,这就是您通过序列化它得到的。

所以您实际上希望将其序列化为当地时间,例如 GMT+X ?正如 cmets 已经提到的,在 json 序列化中没有问题,但是在您向它提供数据的方式上。您应该在序列化之前将其修改为您的要求。

最简单的方法是将其解析为具有所需输出格式的字符串(例如ToString("yyyy-MM-ddTHH:mm:ssZzzz")

您已经问过here 还有些重复的问题,其中包括使用自定义 JsonConverter/ActionFilter 方法的另一种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2015-05-11
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多