将UTC时间字符串反序列化为本地时间

本文关键字:时间 字符串 UTC 反序列化 | 更新日期: 2023-09-27 18:05:33

我的问题与此类似:Asp.net WebApi将UTC时间字符串反序列化为本地时间

除了我使用([FromBody] dtoWithTime)在我的控制器方法

控制器调用看起来像

public JsonResult DiscoverProject([FromBody] dtoWithTime dto)    {}

where

[Serializable]
public class dtoWithTime
{
  public DateTime? dateName { get; set; }
}

请求以POST的形式传入,带有这些标头/数据(取自fiddler)

accept: application/json
content-type: application/json
content-length: 281
Connection: keep-alive
{"dateName":"2014-05-31T00:00:00.000Z"}

当日期进入控制器时,它变成了2014-05-30 20:00:00

我希望日期以Utc类型从UI发送过来。我能够在控制器中使用tuniversaltime()操作日期,这可以按照我想要的方式工作,除了检查此日期的SpecFlow测试失败。如果我能让序列化器保持Utc时间,那就好了。

我尝试使用的是JsonDotNetValueProviderFactory并在global.asax.cs中设置默认设置

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};

这对我来说很有效,但破坏了我们应用程序中的许多序列化,包括枚举。

那么有什么方法可以装饰DateTime吗?或者为MVC json反序列化器设置一个默认的日期类型?

将UTC时间字符串反序列化为本地时间

JSON是一种很棒的数据传输格式。不幸的是,有一件事它做得不好,那就是日期。要让它们在不同的平台上正常工作,存在许多变通方法。最终我们要做的是将所有JSON Date数据作为字符串发送。然后在控制器中,我们使用TryParse:

将它们转换为真正的DateTime类型
DateTime myDate
if (DateTime.TryParse(inputJsonStringDate, out myDate))
    //Success
else
    //Not a valid date