一、问题重现
二、问题分析
三、解决方案
四、代码实现
[cpp] view plaincopy
TIME_ZONE_INFORMATION tziOld;
DWORD dwRet;
dwRet = GetTimeZoneInformation(&tziOld); //该方法是C++自带API
if (dwRet == TIME_ZONE_ID_INVALID)
{
LOGT( Log_Error ) << "Get Timezone faile";
}
float fTimezone = (-tziOld.Bias) / 60;//该"tziOld.Bias"数值是分钟,如果是东八区,这里表示"-480"。</span>
1.2 以Javascript技术开发,获取时区的方式与代码:
[javascript] view plaincopy
var curDateTime = new Date();
var nTimezone = curDateTime.getTimezoneOffset();
g_fTimezone = (-nTimezone) / 60; //同上
[javascript] view plaincopy
var nSplitTime = strDate.indexOf("T"); //注: 这里的strDate就是上述格式的时间串 “2014-10-10T12:20:20+08:00”
var bEastTimezone = true;
var nSplitZone = strDate.indexOf("+");//这里看一下是东区还是西区的
if(nSplitZone == -1){
bEastTimezone = false;
nSplitZone = strDate.indexOf("-");
}
var strDateTemp = strDate.slice(0, nSplitTime);
var strTimeTemp = strDate.slice(nSplitTime + 1, nSplitZone);
var strTimeZoneTemp = strDate.slice(nSplitZone + 1);
var arrayDate = strDateTemp.split("-");
var arrayTime = strTimeTemp.split(":");
var arrayZone = strTimeZoneTemp.split(":");
var nTimeZoneOffset = parseInt(arrayZone[0],10)*60 + parseInt(arrayZone[1],10);
if(!bEastTimezone){
nTimeZone = -nTimeZone;
}
var dateNewTime = new Date(parseInt(arrayDate[0],10), parseInt(arrayDate[1],10)-1,
parseInt(arrayDate[2],10), parseInt(arrayTime[0],10),
parseInt(arrayTime[1],10), parseInt(arrayTime[2],10));
var nTimezoneDiff = (-dateNewTime.getTimezoneOffset()) - nTimeZoneOffset;//算出服务端与客户端的时区差
dateNewTime = dateNewTime.setTime(dateNewTime.getTime() + (nTimezoneDiff * 60 * 1000));
var reDate = new Date(dateNewTime);//“reDate"表示最终在客户端展示的时间
1.2.2 客户端要以此格式的时间向服务端发送,这里就对时区显示“+08:00”的格式做一定解析。Javascript代码如下:
[javascript] view plaincopy
var curDateTime = new Date();
var nTimezone = curDateTime.getTimezoneOffset();
var nDiffMinute = nTimezone % 60;
var nDiffHour = (nTimezone - nDiffMinute) / 60;
nDiffMinute = Math.abs(nDiffMinute);
nDiffHour = Math.abs(nDiffHour);
if(nTimezone<0){
if(nDiffHour >= 10){
g_strTimezone = "+" + nDiffHour;
}else{
g_strTimezone = "+0" + nDiffHour;
}
}else {
if(nDiffHour >= 10){
g_strTimezone = "-" + nDiffHour;
}else {
g_strTimezone = "-0" + nDiffHour;
}
}
[javascript] view plaincopy
if(nDiffMinute >= 10){
g_strTimezone = g_strTimezone + ":" + nDiffMinute;
}else{
g_strTimezone = g_strTimezone + ":0" + nDiffMinute;
}
2、服务端实现
[python] view plaincopy
tm = datetime.utcfromtimestamp(tmpTime) //注:tmpTime 表示日志中所记录的时间差
tm = tm + timedelta(hours=fTimeZone) //注:fTimeZone 就是客户端传过来的时区信息 比如“东八区”—>“+8.0" ,"西九点五区"——>"-9.5"。
服务端暂时先考虑这个,其他后续再补。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。