PHP跨时区(UTC时间)应用解决方案
程序员文章站
2022-04-13 10:32:34
1.将程序内部时区设置为utc时间.(utc 也可以叫 gmt) php设置: date_default_timezone_set("utc"); yii设置: confi...
1.将程序内部时区设置为utc时间.(utc 也可以叫 gmt)
php设置:
date_default_timezone_set("utc");
yii设置:
config/main.php 中添加 :'timezone'=>'utc',
如此设置后,php生成的时间基本都是utc时间了.例如:
//输出当前utc时间
date("y-m-d h:i:s");
2.数据库中存储utc时间.
可以用php控制,也可以通过设置数据库时区来实现.
3.服务端发送到前端的时间均为utc时间格式, 由js将其转换为本地时间后进行显示.js内部数据与显示数据分离.
js转换函数参考:
/**
* 将utc时间转为本地时间
* @param string utctime utc时间字符串 格式 :'y-m-d h:i:s'
* @return string 本地时间字符串 格式 :'y-m-d h:i:s'
*/
function utctolocal(utctime) {
if(utctime==='0000-00-00 00:00:00' || utctime===null || utctime==='' || utctime===undefined)
return utctime;
var loctime = new date(); //local时间对象
utctime=utctime.replace("-", "/").replace("-", "/"); //火狐不兼容'-'分隔日期
//解析字符串及本地时间赋值
loctime.settime(date.parse(utctime)-loctime.gettimezoneoffset()*60000);
//本地时间字符串格式化
var year = loctime.getfullyear();
var month = prezero(loctime.getmonth()+1);
var date = prezero(loctime.getdate());
var hour = prezero(loctime.gethours());
var minute = prezero(loctime.getminutes());
var second = prezero(loctime.getseconds());
return year+'-'+month+'-'+date+' '+hour+':'+minute+':'+second;
}
/**
* 将本地时间转为utc时间
* @param string loctime utc时间字符串 格式 :'y-m-d h:i:s'
* @return string 本地时间字符串 格式 :'y-m-d h:i:s'
*/
function localtoutc(loctime) {
if(loctime==='0000-00-00 00:00:00' || loctime==='0000-00-00' || loctime===null || loctime==='' || loctime===undefined)
return loctime;
var tmptime = new date();
var utctime = new date();
loctime=loctime.replace("-", "/").replace("-", "/"); //火狐不兼容'-'分隔日期
//解析字符串
tmptime.settime(date.parse(loctime));
if(loctime.length>10) {
var year = tmptime.getutcfullyear();
var month = prezero(tmptime.getutcmonth()+1);
var date = prezero(tmptime.getutcdate());
var hour = prezero(tmptime.getutchours());
var minute = prezero(tmptime.getutcminutes());
var second = prezero(tmptime.getutcseconds());
return year+'-'+month+'-'+date +' '+hour+':'+minute+':'+second;
} else {
//设置日期,保留本地时间(供utc转换用)
utctime.setfullyear(tmptime.getfullyear());
utctime.setmonth(tmptime.getmonth());utctime.setmonth(tmptime.getmonth());//?若不重复,则赋值无效
utctime.setdate(tmptime.getdate());
var year = utctime.getutcfullyear();
var month = prezero(utctime.getutcmonth()+1);
var date = prezero(utctime.getutcdate());
return year+'-'+month+'-'+date;
}
}
//单个数字添加前导0
function prezero(str) {
return str.tostring().length<2 ? '0'+str : str;
}
php设置:
date_default_timezone_set("utc");
yii设置:
config/main.php 中添加 :'timezone'=>'utc',
如此设置后,php生成的时间基本都是utc时间了.例如:
//输出当前utc时间
date("y-m-d h:i:s");
2.数据库中存储utc时间.
可以用php控制,也可以通过设置数据库时区来实现.
3.服务端发送到前端的时间均为utc时间格式, 由js将其转换为本地时间后进行显示.js内部数据与显示数据分离.
js转换函数参考:
复制代码 代码如下:
/**
* 将utc时间转为本地时间
* @param string utctime utc时间字符串 格式 :'y-m-d h:i:s'
* @return string 本地时间字符串 格式 :'y-m-d h:i:s'
*/
function utctolocal(utctime) {
if(utctime==='0000-00-00 00:00:00' || utctime===null || utctime==='' || utctime===undefined)
return utctime;
var loctime = new date(); //local时间对象
utctime=utctime.replace("-", "/").replace("-", "/"); //火狐不兼容'-'分隔日期
//解析字符串及本地时间赋值
loctime.settime(date.parse(utctime)-loctime.gettimezoneoffset()*60000);
//本地时间字符串格式化
var year = loctime.getfullyear();
var month = prezero(loctime.getmonth()+1);
var date = prezero(loctime.getdate());
var hour = prezero(loctime.gethours());
var minute = prezero(loctime.getminutes());
var second = prezero(loctime.getseconds());
return year+'-'+month+'-'+date+' '+hour+':'+minute+':'+second;
}
/**
* 将本地时间转为utc时间
* @param string loctime utc时间字符串 格式 :'y-m-d h:i:s'
* @return string 本地时间字符串 格式 :'y-m-d h:i:s'
*/
function localtoutc(loctime) {
if(loctime==='0000-00-00 00:00:00' || loctime==='0000-00-00' || loctime===null || loctime==='' || loctime===undefined)
return loctime;
var tmptime = new date();
var utctime = new date();
loctime=loctime.replace("-", "/").replace("-", "/"); //火狐不兼容'-'分隔日期
//解析字符串
tmptime.settime(date.parse(loctime));
if(loctime.length>10) {
var year = tmptime.getutcfullyear();
var month = prezero(tmptime.getutcmonth()+1);
var date = prezero(tmptime.getutcdate());
var hour = prezero(tmptime.getutchours());
var minute = prezero(tmptime.getutcminutes());
var second = prezero(tmptime.getutcseconds());
return year+'-'+month+'-'+date +' '+hour+':'+minute+':'+second;
} else {
//设置日期,保留本地时间(供utc转换用)
utctime.setfullyear(tmptime.getfullyear());
utctime.setmonth(tmptime.getmonth());utctime.setmonth(tmptime.getmonth());//?若不重复,则赋值无效
utctime.setdate(tmptime.getdate());
var year = utctime.getutcfullyear();
var month = prezero(utctime.getutcmonth()+1);
var date = prezero(utctime.getutcdate());
return year+'-'+month+'-'+date;
}
}
//单个数字添加前导0
function prezero(str) {
return str.tostring().length<2 ? '0'+str : str;
}
上一篇: 以高考移民为目的的骗婚案