MVC , JsonResult , DateTime and TimeZone
The jsonresult of date time is serializing to the string /Date and some integer value starting with 1970 . The problem is that the browser interprets this value accordingly to the LOCAL TimeZone – and thus the same date is going to be interpreted with a difference.
I was thinking that I can adjust from UTC time offset of the server( obtained with .NET from TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes) and the UTC time offset of the client( obtained with (new Date()).getTimezoneOffset() + UTCServerMinutes; ). Unfortunately, the code does not work for SAMOA ( 13 hours difference).
Pay attention that the server is sending SAME data – just the browser is interpreting from the local user time zone.
So the solution is to convert the date to a string ( I have chosed yyyy-MM-ddTHH:mm:ss) and interpret in javascript( see date2 below).
The server code – I have put my birthdate 16 april 1970
DateTime res = new DateTime(1970, 04, 16, 22, 0, 0); [HttpPost] public JsonResult GetDateBirth() { var str = res.ToString("s"); return Json(new { date =res, datestring=str, ok = true }); }
The Javascript code:
function GetJsonDate() { $.ajax({ type: "POST", url: '@Url.Action("GetDateBirth")', datatype: "JSON", contentType: "application/json; charset=utf-8", success: function (returndata) { if (returndata.ok) { window.alert('The server is sending:' + returndata.date + " -- " + returndata.datestring); var d = parseInt(returndata.date.substr(6)); var date1 = new Date(d); var date2 = dateFromSortable(returndata.datestring); var date3= getDateString(returndata.date); window.alert('original: ' + date1 + '\r\n' + ' iso correct:'+ date2 + '\r\n'+ ' utc difference not good:' + date3); } else { //this is an error from the server window.alert(' error : ' + returndata.message); } } } ); } function dateFromSortable(dateStr) { var parts = dateStr.match(/\d+/g); return new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]); } function getDateString(jsonDate) { //does not work correctly for SAMOA - it have some hours difference var UTCServerMinutes = @serverMinutes; if (jsonDate == undefined) { return ""; } var utcTime = parseInt(jsonDate.substr(6)); var dateUtc = new Date(utcTime); var minutesOffset = (new Date()).getTimezoneOffset() + UTCServerMinutes; var milliseconds = minutesOffset * 60000; var d = new Date(dateUtc.getTime() + milliseconds) return d; }
How to test it:
Run the project. Click “Get Json Date” – and you will see the three dates equal.
Now change the time zone to Samoa ( or other, if you live in Samoa )
Click again on “Get Json Date” – the date will same 16 april 1970 just for the date2 – obtained from dateFromSortable javascript function.
Please note that the local time zone is NOT affecting the values transmitted via ViewBag/ViewData/Model, but just the ones transmitted via Json.
The project can be downloaded from here