阻止MVC时区日期转换

时间:2016-09-30 14:16:00

标签: asp.net-mvc

我有一个系统,多个时区的多个用户和其他系统使用该系统。我在Azure上托管它。我想在当地时间保存所有日期,而不是服务器时间。我能够通过跟踪每个客户的本地时区来实现这一点,并且在将日期保存到数据库之前我将其抵消。

到目前为止一切运行良好,但是当日期被发送回客户端的浏览器时,MVC认为它们是UTC(这是所有Azure VM的服务器时间)并抵消了小时数。

防止这种情况的最有效方法是什么?我尝试将DateTimeKind设置为local,但这没有达到预期的效果。日期仍然被转换。我想我可以将日期作为字符串传递,但这似乎是一个黑客。必须有更好的方法来做到这一点。

非常感谢您的建议。

1 个答案:

答案 0 :(得分:1)

好的,经过几天的搜索和测试,我找到了解决问题的解决方案。

在服务器上:

public JsonResult GetModel()
{
  EOListModel model = _repo.Getmodel();
  return Json(JsonConvert.SerializeObject(model));
}

这里有几点意见: - 该方法返回JsonResult - 我们将模型序列化为json字符串

在客户端:

$.ajax({
  type: "POST",
  url: "/Controller/GetModel",
  data: null
  }).done(function (result) {
    var m = JSON.parse(result);
    ...
});

结果将是你的json字符串,并且在解析之后你将获得日期完整的对象。

我不是肯定的,这是实现这一目标的最佳方式,但它的工作原理并且代码更改量最小。

感谢。

修改

在服务器方法中,您还需要指示JSON.NET不要附加时区:

return Json(JsonConvert.SerializeObject(model, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Unspecified }));

否则Javascript或Moment将转换日期。有关详细信息,请参阅http://www.newtonsoft.com/json/help/html/SerializeDateTimeZoneHandling.htm