當你的服務器是針對世界各地用戶提供服務的時候,如果正好你想正確顯示服務器的時間。那么你應該獲取正確的服務器時間並轉化成客戶端本地時間的時間在客戶端顯示與調用。而不應該像“鐵路購票系統”一樣直接使用客戶端的本地時間而出現一系列有趣的BUG。
那么我們應該如何將服務器的協調世界(UTC)時間轉換成我們客戶端所在時區的正確時間呢?
我們首先應該了解到的時區概念應該是這樣的,比如“北京時間”,相對於“世界時間”要正向偏移8個小時0分鍾,表示為“+08 00”;假如世界時間是10點,那么我們計算出來的北京時間應該是,世界時間10點+8個小時0分鍾=18點。
下來我們看看我們是如何從服務器獲取世界時間並轉化成本地時間的。
首先,我們應該知道本地時間的時區時間偏移量:即介紹中的“+08 00”。
我們使用JS方法來獲得這個值:
function clientTimeZone() { //獲得時區偏移量 var timeOffset = new Date().getTimezoneOffset(); //獲得時區小時偏移基數 var hour = parseInt(timeOffset / 60); //獲得時區分鍾偏移基數 var munite = timeOffset % 60; var prefix = "-"; if (hour < 0 || munite < 0) { prefix = "+"; hour = -hour; if (munite < 0) { munite = -munite; } } hour += " "; munite += " "; if (hour.length == 2) { hour = "0" + hour; } if (munite.length == 2) { munite = "0" + munite; } return prefix + hour + munite; }
使用上面方法能很方便的獲取時區時間偏移值。
接下來我們應該使用ajax或者頁面回發的方式調用服務器端方法。基於情況不同,調用服務器端方法略。
我們的服務器端方法首先會先獲得當前的“協調世界(UTC)時間”,再同“時區時間偏移值”相加的方式來得到客戶端時間。
方法如下:
/// <summary> /// 計算客戶端所在時區時間 /// </summary> /// <param name="clientTimeOffset">要傳入的時區時間偏移值</param> /// <returns>客戶端時區時間</returns> public DateTime GetClientTime(string clientTimeOffset) { //獲取協調世界時間 DateTime utcTime = DateTime.UtcNow; //按小時,分鍾分割時區偏移值 string[] timeOffset = clientTimeOffset.Split(' '); int hourOffset = int.Parse(timeOffset[0]); int minuteOffset = int.Parse(timeOffset[1]); //協調世界時間與時區小時偏移值相加 utcTime = utcTime.AddHours(hourOffset); //協調世界時間與時區分鍾偏移值相加 utcTime = utcTime.AddMinutes(minuteOffset); return utcTime; }
通過GetClientTime方法我們能夠正確得到客戶端所在時區的時間。調用它並返回它就可以放心在客戶端應用了。
更多WEB開發技術請加群:Asp.Net高級群 號碼:261882616 博主以及同事和你共同探討感興趣的話題。