用户在表单中输入日期,但是当我通过AJAX json调用传递日期时,我的日期将被DataContractJsonSerializer更改。
下面是我的AJAX调用:
function Save()
{
//Convert date to milliseconds from from 1/1/1970 - necessary for passing a date through JSON
var d = "09/01/2010 05:00";
myDate = new Date(d);
myTicks = myDate.getTime();
var message =
{
MessageID: $("#MessageID").val(),
MessageDate: '\/Date(' + myTicks + ')\/',
};
$.ajax({
url: "<%= Url.Action("SaveMessage") %>",
type: "POST",
dataType: "json",
data: $.toJSON(message),
contentType: "application/json; charset=utf-8",
success: function(result)
{
if (result && result.success)
{
//
}
}
});
}下面是我的序列化代码:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json"))
{
var serializer = new DataContractJsonSerializer(RootType);
filterContext.ActionParameters[Param] = serializer.ReadObject(filterContext.HttpContext.Request.InputStream);
}
}把我的日期改成了格林尼治标准时间。因此,如果用户输入"09/01/2010 05:00",那么序列化后的结果是"09/01/2010 09:00“。
我可以使用下面的函数在我的本地环境中修复这个问题,但它在生产环境中不起作用。在我的本地环境中,服务器时间设置为EST (上午11:00)。在生产环境中,服务器时间设置为GMT (下午3:00)。
下面是我的转换函数:
public DateTime ConvertToLocal(DateTime dt)
{
int hours = TimeZoneInfo.Local.GetUtcOffset(dt).Hours;
DateTime dtGMT = dt.AddHours(Convert.ToDouble(hours));
return dtGMT;
}这会正确地将我的日期从"09/01/2010 09:00 AM“更改回本地环境中的"09/01/2010 05:00 AM”,但在生产环境中它仍然是"09/01/2010 09:00 AM“。
似乎在生产中,DataContractJsonSerializer意识到我是从美国东部时间浏览的,所以它增加了4个小时。但是由于我的生产服务器在格林尼治标准时间,我的ConvertToLocal不工作,该函数中的时区偏移量是0而不是-4。
我能做些什么来解决这个问题呢?
发布于 2010-09-02 00:47:24
您可能希望使用myTicks = myDate.UTC();而不是myTicks = myDate.getTime();
getTime()使用本地时间(基于运行浏览器的时区)。UTC()也给出了自1970年1月1日以来的毫秒数,但它是1970年1月1日UTC,而不是本地时间。Microsoft的JSON日期序列化使用UTC度量。
这样你就不需要做任何服务器端转换了。
https://stackoverflow.com/questions/3619451
复制相似问题