2015-11-01 64 views
1

我使用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); 
    } 
+1

看看moment.js。 http://momentjs.com/docs/ – dbugger

+0

@dbugger,圖書館如何知道'10/31/2015 7:29:54 PM'是UTC?在我的場景中,像'10/31/2015 7:29:54 PM'這樣的UTC值正被存儲在cookie中。 – Sunil

+1

此信息可能幫助:http://stackoverflow.com/questions/2532729/daylight-saving-time-and-time-zone-best-practices – LGSon

回答

2

雖然評論已經指向你在正確的方向:

如果使用moment.js將默認使用UTC格式,即使它不是(爲完整的緣故),你可以使用這個格式來指定偏移:2013-02-08 09:30:26.123+07:00

你叫這樣的代碼:moment(cDate, $format);

1

如果我正確理解你的問題,你要轉換的從UTC到當地時間的cookie中傳遞的日期。

您可以使用Date.prototype.getTimezoneOffset()

getTimezoneOffset返回從UTC的偏移量以分鐘爲單位的本地時間。

減去偏移分鐘本地調整...

new Date(dateServer.getTime() - ((60 * 1000) * dateServer.getTimezoneOffset()))

下面是一個例子...

var dateJan; 
 
    var dateJul; 
 
    var dateValue; 
 

 
    var divLocal; 
 
    var divServer; 
 

 
    var timezoneOffset; 
 

 
    dateValue = new Date('10/31/2015 7:29:54 PM') 
 

 
    divServer = document.getElementById('serverUTCTime'); 
 
    divLocal = document.getElementById('localTime') 
 

 
    divServer.innerHTML = 'from server = ' + dateValue.toString(); 
 

 
    // Get dates for Jan & Jul 
 
    dateJan = new Date(dateValue.getFullYear(), 0, 1); 
 
    dateJul = new Date(dateValue.getFullYear(), 6, 1); 
 

 
    // Get timezone offset 
 
    timezoneOffset = Math.max(dateJan.getTimezoneOffset(), dateJul.getTimezoneOffset()); 
 

 
    // Check if daylight savings 
 
    if (dateValue.getTimezoneOffset() < timezoneOffset) { 
 
     // Adjust date by Jan offset 
 
     dateValue = new Date(dateValue.getTime() - ((60 * 1000) * dateJan.getTimezoneOffset())); 
 
    } else { 
 
     // Adjust date by Jul offset 
 
     dateValue = new Date(dateValue.getTime() - ((60 * 1000) * dateJul.getTimezoneOffset())); 
 
    } 
 

 
    divLocal.innerHTML = 'to local = ' + dateValue.toString();
<div id="serverUTCTime"></div> 
 
<br/> 
 
<div id="localTime"></div>

+0

如何將客戶端知道從ASP.Net收到的日期格式以mm/dd/yyyy格式顯示。它也可能是dd/mm/yyyy格式。例如,如果ASP.Net發送'10/11/2015 7:29:54 PM',JavaScript如何知道第一部分是月份還是日期。我認爲將日期字符串傳遞給Date對象'new Date('10/31/2015 7:29:54 PM')'是個問題。我認爲如果將單個組件傳遞給JavaScript Date對象而不是從ASP.Net接收的日期時間值,會更好。 – Sunil

+0

此外,不確定是否通過使用此方法來解決日節省時間。我在另一個stackoverflow文章中遇到了這個問題:「'getTimezoneOffset'返回你調用它的日期和時間的偏移量。當夏令時或夏時制轉換時區時,偏移量可能會發生變化。」 – Sunil

+1

請參閱夏令時編輯調整,至於格式,強制兩側相同... – WhiteHat