PHP跨时区(UTC时间)应用解决方案

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;

  }