我的问题与此类似: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反序列化器设置默认日期类型?
答案 0 :(得分:0)
JSON是一种用于传输数据的出色格式。不幸的是,它做得不好的一件事是日期。有许多解决方法可以让它们在不同的平台上正常工作。最终我们最终做的是将所有JSON Date数据作为字符串发送。然后在我们的控制器中,我们使用TryParse将它们转换为真实的DateTime类型:
DateTime myDate
if (DateTime.TryParse(inputJsonStringDate, out myDate))
//Success
else
//Not a valid date