写脚本时经常遇到有关不同地方的服务器的时间同步问题,现整理一下以作备忘。
UTC: Universal Time Coordinated 协调世界时,又称世界标准时间
GMT: Greenwich Mean Time 格林尼治平均时
UTC和GMT都与英国伦敦的本地时相同,所以程序中UTC与GMT没什么不同。
时区:全球24个时区,把以伦敦为中心的世界地图展开,UTC和GMT的伦敦是0区,伦敦的右边直到新西兰的东部不远的斐济为东区,而左边到太平洋中间为西区。一般用5位时区差来表示与UTC相差的小时数,东区为正,西区为负。如北京时区是东八区,领先UTC八个小时,记为 +0800;纽约的时区是西五区,比UTC落后五个小时,记为 -0500。
UTC + 时区差 = 本地时间
时间戳:
PHP记为自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。PHP用time()函数来获得当前时间戳,用mktime来生成一个时间戳。
Javascript则精确到毫秒数。用dateObject.getTime()来获得当前时间戳,用Date.parse(datestring)来生成一个时间戳。
**纽约时间(-0500)和北京时间换算:
UTC + (-0500) = 纽约时间 (3)
UTC = 纽约时间 + 0500 (4)
把(2)式 - (4)式相比较,
UTC = 北京时间 - 0800 = 纽约时间 + 0500 (5)
即 北京时间 = 纽约时间 + 1300 (6)
即北京时间领先纽约时间十三个小时,由(6)式,
纽约时间 = 北京时间 - 1300 (7)
在四月下旬,纽约又换用夏令时,又称为日光节约时,比标准纽约时间提前一个小时,实际成为西四区的标准时间,成为 -0400。
UTC + (-0400) = 纽约夏令时,套用以上公式,
北京时间 = 纽约夏令时 + 1200
纽约夏令时 = 北京时间 - 1200
**电子邮件中的时间:
Email程序记录的是发信服务器本地RFC 822格式的时间,在电子邮件信头的Date域记为+0800:
Date: Fri, 08 Nov 2002 09:42:22 +0800
Date信头是可以修改的,所以平时可以看到垃圾邮件的时间是几十年前或后。
而像Outlook和Thunderbird会自动把UTC转换为本地时间,想要看真实时间的话要查看完整邮件头。
**把服务器上记录的时间转换为客户端本地时间
<?
/**
* 把如 -02-12 15:48:45 +0800 格式的时间转换为浏览者的本地时间
* 调用方法:
* <script language="JavaScript">calcLocaltime(<? echo themktime($tmptime); ?>, <? echo thezone($tmptime); ?>)</script>
*/
function themktime($datetime) { //把时间 -02-12 15:48:45 转换为时间戳
$hour = substr($datetime, 11, 2);
$min = substr($datetime, 14, 2);
$sec = substr($datetime, 17, 2);
$mon = substr($datetime, 5, 2);
$day = substr($datetime, 8, 2);
$year = substr($datetime, 0, 4);
$unixtime = mktime($hour, $min, $sec, $mon, $day, $year);
return $unixtime;
}
function thezone($datetime) { //提取时区小时差
$zone = substr($datetime, 20, 3);
return $zone;
}
?>
<script language="JavaScript">
function calcLocaltime(remotetime, offset) { //remotetime为服务器时间戳,offset为时区小时差
utc = remotetime * 1000 - offset * 3600 * 1000; //JS时间戳为毫秒,而PHP为秒,要作换算(*1000)
d = new Date();
nd = new Date(utc - ( 60000 * d.getTimezoneOffset() ) ); //注意: getTimezoneOffset = UTC - 本地时间,结果以分为单位;而一般时区差 = 本地时间 - UTC,以小时为单位
document.write(nd.toLocaleString());
}
</script>