2010-09-01 76 views
2

用戶在表單中輸入日期,但是當我通過AJAX json調用傳遞日期時,DataContractJsonSerializer會更改我的日期。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); 
    } 
} 

它改變了我的日期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點」在我當地的環境,但在生產上它保持「09/01/2010 09:00 AM」。

看起來在生產中,DataContractJsonSerializer意識到我正在瀏覽EST,所以它增加了4個小時。但由於我的生產服務器在格林尼治標準時間,我的ConvertToLocal不起作用,該函數中的時區偏移量爲0而不是-4。

我能做些什麼來解決這個問題?

回答

5

而不是使用myTicks = myDate.getTime();,你可能想使用myTicks = myDate.UTC();

的getTime()使用的是當地時間(基於在瀏覽器中運行的時區)。 UTC()也會爲您提供1970年1月1日以來的毫秒數,但它是1970年1月1日UTC而不是當地時間。 Microsoft的JSON序列化日期使用UTC度量。

然後你不需要做任何服務器端轉換。

+0

謝謝你,完美的作品。 – Steven 2010-09-01 17:32:06