我使用ASP.Net服務器端C#代碼將日期時間值存儲在cookie中。 在客戶端,我正在閱讀日期並使用JavaScript將其轉換爲UTC。代碼如下。ASP.Net通過Cookie發送的JavaScript解析日期
存儲日期時間在ASP.Net
//DateTime.Now depends on location of web server
HttpCookie cookie = new HttpCookie("xyz", DateTime.Now.ToUniversalTime().ToString());
Response.Cookies.Add(cookie);
JavaScript代碼讀取由ASP.Net
//cDate depends on user's location
//c is value read from cookie named 'xyz'
var cDate = new Date(c);
var cDate_utc = new Date(cDate.getUTCFullYear(), cDate.getUTCMonth(), cDate.getUTCDate(), cDate.getUTCHours(), cDate.getUTCMinutes(), cDate.getUTCSeconds());
當最終用戶的位置是從ASP不同發送日期時間。網絡服務器的位置,那麼Cookie中的日期時間值將被JavaScript錯誤地解釋。例如,在一種情況下,存儲在cookie中的值爲10/31/2015 7:29:54 PM
,並且JavaScript沒有辦法知道這是UTC,這意味着它將在客戶端被錯誤地解析。
問題:如何傳遞DateTime值從ASP.Net與JavaScript在上述情況下,因此在JavaScript中正確地解釋不管最終用戶的瀏覽器和ASP.Net Web服務器的地理位置是誰?
更新與解決方案,工作
了大量的研究後,我想出了以下內容。底線是始終以UTC工作,所以節省的光線不會導致編程邏輯問題。
- 傳遞UTC而不是本地日期時間從ASP.Net服務器端到客戶端通過使用日期時間的單個組件的cookie。不要使用日期時間字符串,而是將日期時間的各個組成部分作爲以逗號分隔的列表,格式如下:
year,month, day, hours, min, sec, milliseconds
。傳遞單個組件而不是ASP.Net中的日期時間字符串更好,因爲JavaScript日期構造函數在解析字符串時可能會以不穩定的方式運行,特別是如果傳遞的字符串格式不是構造函數喜歡的格式。傳遞單個組件還有助於跨瀏覽器一致的行爲,因爲具有單獨組件的Date構造函數在所有主流瀏覽器中都能很好地工作。 - 在客戶端,讀取cookie值並實例化一個Date對象,該對象將在瀏覽器端對應服務器端的本地時間UTC時間
- 現在,您的服務器端ASP.Net傳遞日期時間在客戶端的本地日期時間。這可能適用於某些情況,但在夏令時發生時可能會在客戶端引起突然的意外,所以最好將此客戶端日期轉換爲UTC。在UTC到客戶端
證日期時間從ASP.Net
DateTime utcDateTime = DateTime.Noe.ToUniversalTime();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(utcDateTime.Year);
sb.Append(",");
sb.Append(utcDateTime.Month - 1); //since JavaScript uses a 0 based index for month
sb.Append(",");
sb.Append(utcDateTime.Day);
sb.Append(",");
sb.Append(utcDateTime.Hour);
sb.Append(",");
sb.Append(utcDateTime.Minute);
sb.Append(",");
sb.Append(utcDateTime.Second);
sb.Append(",");
sb.Append(utcDateTime.Millisecond);
HttpCookie cookie = new HttpCookie("xyz", sb.ToString());
Response.Cookies.Add(cookie);
獲取UTC日期時間的JavaScript通過ASP。淨日期時間
var c = getCookie("xyz");//getCookie is a custom JavaScript function to read cookie value
if (c) {
var dateArray = c.split(",");
//get local date time corresponding to ASP.Net passed UTC date time
var cDate = new Date(Date.UTC(dateArray[0], dateArray[1],dateArray[2], dateArray[3], dateArray[4], dateArray[5], dateArray[6])) ;
//get UTC date time so day light savings does not cause issues in logic on client-side
cDate_utc = new Date(cDate.getUTCFullYear(), cDate.getUTCMonth(), cDate.getUTCDate(), cDate.getUTCHours(), cDate.getUTCMinutes(), cDate.getUTCSeconds());
logInfo("date from cookie in utc is " + cDate_utc);
}
看看moment.js。 http://momentjs.com/docs/ – dbugger
@dbugger,圖書館如何知道'10/31/2015 7:29:54 PM'是UTC?在我的場景中,像'10/31/2015 7:29:54 PM'這樣的UTC值正被存儲在cookie中。 – Sunil
此信息可能幫助:http://stackoverflow.com/questions/2532729/daylight-saving-time-and-time-zone-best-practices – LGSon