溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

關(guān)于客戶端與服務(wù)端時區(qū)不同導(dǎo)致客戶端上的時間不準(zhǔn)問題的解決方案

發(fā)布時間:2020-07-13 06:48:19 來源:網(wǎng)絡(luò) 閱讀:945 作者:yangyuyu 欄目:web開發(fā)

一、問題重現(xiàn)

隨著企業(yè)向國際化方向發(fā)現(xiàn),軟件也不到不斷向國際化發(fā)展。像軟件實現(xiàn)多語言方案等等。但是服務(wù)端與客戶端不在同一時區(qū)里,就會導(dǎo)致客戶端上時間可能不準(zhǔn)確,比如客戶端要下載一份服務(wù)器上日志,日志上會有時間,就無法提供準(zhǔn)備時間,因為用戶一般都會以自己所在的時區(qū)上時間來看日志,但是日志卻以服務(wù)端上時區(qū)顯示時間。

二、問題分析

1、用戶需要也是能夠使用用戶所在時區(qū)的時間。

2、服務(wù)端寫日志一定以服務(wù)端上的時區(qū)或者以0時區(qū)來寫入日志。

3、這樣就用戶下載后日志上的時間就不是以用戶的時區(qū)為時間的基準(zhǔn)了,即時間不準(zhǔn)確。

三、解決方案

總方案是客戶端在下載前先告訴服務(wù)端要以什么時區(qū)進(jìn)入寫入日志,然后服務(wù)端就以該時區(qū)作為基準(zhǔn)對日志上的時間做一定修改。

四、代碼實現(xiàn)

1、客戶端的代碼實現(xiàn)

1.1  以C++技術(shù)開發(fā)的,獲取時間區(qū)的方式與代碼:


[cpp] view plaincopy

  1. TIME_ZONE_INFORMATION tziOld;  

  2.  DWORD dwRet;  

  3.  dwRet = GetTimeZoneInformation(&tziOld);  //該方法是C++自帶API  

  4.  if (dwRet == TIME_ZONE_ID_INVALID)  

  5.  {  

  6.       LOGT( Log_Error ) << "Get Timezone faile";  

  7.  }  

  8.  float fTimezone = (-tziOld.Bias) / 60;//該"tziOld.Bias"數(shù)值是分鐘,如果是東八區(qū),這里表示"-480"。</span>  

1.2  以Javascript技術(shù)開發(fā),獲取時區(qū)的方式與代碼:

[javascript] view plaincopy

  1. var curDateTime = new Date();  

  2. var nTimezone = curDateTime.getTimezoneOffset();   

  3. g_fTimezone = (-nTimezone) / 60;             //同上  

網(wǎng)頁客戶端如果使用“2014-10-10T12:20:20+08:00”這樣格式的字符串進(jìn)入客戶端與服務(wù)端通信。


1.2.1  服務(wù)端若上述格式發(fā)送網(wǎng)頁客戶端,那網(wǎng)頁客戶端要將其轉(zhuǎn)換成客戶端所在時區(qū)的時間。像火狐等瀏覽器可以直接通過Date類轉(zhuǎn)換,但是IE瀏覽器卻無法直接轉(zhuǎn)換。那就必須使用其他方案將其轉(zhuǎn)換。(考慮瀏覽器的兼容性,這里使用下面的方法)其Javascript代碼如下:


[javascript] view plaincopy

  1. var nSplitTime = strDate.indexOf("T");      //注: 這里的strDate就是上述格式的時間串  “2014-10-10T12:20:20+08:00”  

  2. var bEastTimezone = true;  

  3. var nSplitZone = strDate.indexOf("+");//這里看一下是東區(qū)還是西區(qū)的  

  4. if(nSplitZone == -1){  

  5.  bEastTimezone = false;  

  6.  nSplitZone = strDate.indexOf("-");  

  7. }  

  8.   

  9. var strDateTemp = strDate.slice(0, nSplitTime);  

  10. var strTimeTemp = strDate.slice(nSplitTime + 1, nSplitZone);  

  11. var strTimeZoneTemp = strDate.slice(nSplitZone + 1);  

  12. var arrayDate = strDateTemp.split("-");  

  13. var arrayTime = strTimeTemp.split(":");  

  14. var arrayZone = strTimeZoneTemp.split(":");  

  15. var nTimeZoneOffset = parseInt(arrayZone[0],10)*60 + parseInt(arrayZone[1],10);  

  16. if(!bEastTimezone){  

  17.     nTimeZone = -nTimeZone;  

  18. }  

  19. var dateNewTime = new Date(parseInt(arrayDate[0],10), parseInt(arrayDate[1],10)-1,  

  20.                            parseInt(arrayDate[2],10), parseInt(arrayTime[0],10),  

  21.                            parseInt(arrayTime[1],10), parseInt(arrayTime[2],10));  

  22.   

  23. var nTimezoneDiff = (-dateNewTime.getTimezoneOffset()) - nTimeZoneOffset;//算出服務(wù)端與客戶端的時區(qū)差  

  24.   

  25. dateNewTime = dateNewTime.setTime(dateNewTime.getTime() + (nTimezoneDiff * 60 * 1000));  

  26.   

  27. var reDate = new Date(dateNewTime);//“reDate"表示最終在客戶端展示的時間 

1.2.2  客戶端要以此格式的時間向服務(wù)端發(fā)送,這里就對時區(qū)顯示“+08:00”的格式做一定解析。Javascript代碼如下:



[javascript] view plaincopy

  1. var curDateTime = new Date();  

  2. var nTimezone = curDateTime.getTimezoneOffset();  

  3. var nDiffMinute = nTimezone % 60;  

  4. var nDiffHour = (nTimezone - nDiffMinute) / 60;  

  5. nDiffMinute = Math.abs(nDiffMinute);  

  6. nDiffHour = Math.abs(nDiffHour);  

  7. if(nTimezone<0){  

  8.  if(nDiffHour >= 10){  

  9.   g_strTimezone = "+" + nDiffHour;  

  10.  }else{  

  11.   g_strTimezone = "+0" + nDiffHour;  

  12.  }  

  13. }else {  

  14.  if(nDiffHour >= 10){  

  15.   g_strTimezone = "-" + nDiffHour;  

  16. }else {  

  17.  g_strTimezone = "-0" + nDiffHour;  

  18.  }  

  19. }  

[javascript] view plaincopy

  1. if(nDiffMinute >= 10){  

  2.  g_strTimezone = g_strTimezone + ":" + nDiffMinute;  

  3. }else{  

  4.  g_strTimezone = g_strTimezone + ":0" + nDiffMinute;  

  5. }  

2、服務(wù)端實現(xiàn)


2.1  服務(wù)端如果使用python技術(shù)實現(xiàn),這里主要是客戶端下載服務(wù)端的日志文件的解析。從上述方案上可以知道,這里需要客戶端將它所在時區(qū)上傳到服務(wù)端,服務(wù)端才將日志中的時間修改成該時區(qū)的時間。python代碼實現(xiàn)如下:


[python] view plaincopy

  1. tm = datetime.utcfromtimestamp(tmpTime)   //注:tmpTime 表示日志中所記錄的時間差  

  2. tm = tm + timedelta(hours=fTimeZone)  //注:fTimeZone 就是客戶端傳過來的時區(qū)信息  比如“東八區(qū)”—>“+8.0" ,"西九點五區(qū)"——>"-9.5"。

服務(wù)端暫時先考慮這個,其他后續(xù)再補(bǔ)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI