C# DataContractJsonSerializer更改我的日期
用户在表单中输入日期,但当我通过AJAX json调用传递日期时,我的日期会被DataContractJsonSerializer更改 以下是我的AJAX调用:C# DataContractJsonSerializer更改我的日期,c#,.net,ajax,json,C#,.net,Ajax,Json,用户在表单中输入日期,但当我通过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
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)
{
//
}
}
});
}
它将我的日期更改为GMT。因此,如果用户输入“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意识到我是从EST浏览的,所以它增加了4个小时。但是由于我的生产服务器是GMT,我的ConvertToLocal无法工作,该函数中的时区偏移量是0而不是-4
如何解决此问题?而不是使用
myTicks=myDate.getTime()
您可能希望使用myTicks=myDate.UTC()代码>
getTime()使用本地时间(基于浏览器运行的时区)。UTC()还提供自1970年1月1日起的毫秒,但它是1970年1月1日UTC而不是本地时间。Microsoft的JSON日期序列化使用UTC度量
那么您不需要进行任何服务器端转换
public DateTime ConvertToLocal(DateTime dt)
{
int hours = TimeZoneInfo.Local.GetUtcOffset(dt).Hours;
DateTime dtGMT = dt.AddHours(Convert.ToDouble(hours));
return dtGMT;
}