C# DataContractJsonSerializer更改我的日期

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

用户在表单中输入日期,但当我通过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)
            {
                //
            }
        }
    }); 
}
它将我的日期更改为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;
}