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

时间:2014-05-28 19:58:51

标签: c# json asp.net-mvc-4 datetime deserialization

我的问题与此类似:Asp.net WebApi deserializes UTC time string to local time

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

控制器调用看起来像

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

其中(我已将其简化为例如使用。)

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

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

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发送日期。我可以在控制器中使用ToUniversalTime()操作日期,这可以按我的意思工作,但检查此日期的SpecFlow测试失败。如果我能让序列化器保持Utc时间一切都会好的。

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

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

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

那么无论如何要装饰DateTime?或者为MVC json反序列化器设置默认日期类型?

1 个答案:

答案 0 :(得分:0)

JSON是一种用于传输数据的出色格式。不幸的是,它做得不好的一件事是日期。有许多解决方法可以让它们在不同的平台上正常工作。最终我们最终做的是将所有JSON Date数据作为字符串发送。然后在我们的控制器中,我们使用TryParse将它们转换为真实的DateTime类型:

DateTime myDate
if (DateTime.TryParse(inputJsonStringDate, out myDate))
    //Success
else
    //Not a valid date
相关问题