我有一个系统,多个时区的多个用户和其他系统使用该系统。我在Azure上托管它。我想在当地时间保存所有日期,而不是服务器时间。我能够通过跟踪每个客户的本地时区来实现这一点,并且在将日期保存到数据库之前我将其抵消。
到目前为止一切运行良好,但是当日期被发送回客户端的浏览器时,MVC认为它们是UTC(这是所有Azure VM的服务器时间)并抵消了小时数。
防止这种情况的最有效方法是什么?我尝试将DateTimeKind设置为local,但这没有达到预期的效果。日期仍然被转换。我想我可以将日期作为字符串传递,但这似乎是一个黑客。必须有更好的方法来做到这一点。
非常感谢您的建议。
答案 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。