温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

关于客户端与服务端时区不同导致客户端上的时间不准问题的解决方案

发布时间:2020-07-13 06:48:19 阅读:949 作者:yangyuyu 栏目:web开发
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

一、问题重现

二、问题分析

三、解决方案

四、代码实现

[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"数值是分钟,如果是东八区,这里表示"-480"。</span>  

1.2  以Javascript技术开发,获取时区的方式与代码:

[javascript] view plaincopy

  1. var curDateTime = new Date();  

  2. var nTimezone = curDateTime.getTimezoneOffset();   

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

[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("+");//这里看一下是东区还是西区的  

  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;//算出服务端与客户端的时区差  

  24.   

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

  26.   

  27. var reDate = new Date(dateNewTime);//“reDate"表示最终在客户端展示的时间 

1.2.2  客户端要以此格式的时间向服务端发送,这里就对时区显示“+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、服务端实现

[python] view plaincopy

  1. tm = datetime.utcfromtimestamp(tmpTime)   //注:tmpTime 表示日志中所记录的时间差  

  2. tm = tm + timedelta(hours=fTimeZone)  //注:fTimeZone 就是客户端传过来的时区信息  比如“东八区”—>“+8.0" ,"西九点五区"——>"-9.5"。

服务端暂时先考虑这个,其他后续再补。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×