UTC GMT 时区 时间戳

写脚本时经常遇到有关不同地方的服务器的时间同步问题,现整理一下以作备忘。



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转换为本地时间,想要看真实时间的话要查看完整邮件头。


**把服务器上记录的时间转换为客户端本地时间
<?
/**
 * 把如 2009-02-12 15:48:45 +0800 格式的时间转换为浏览者的本地时间
 * 调用方法:
 * <script language="JavaScript">calcLocaltime(<? echo themktime($tmptime); ?>, <? echo thezone($tmptime); ?>)</script>
 */
function themktime($datetime) { //把时间 2009-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>

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值