有一种情形是这样子的,比如机票业务中的订票流程,我们需要一个非常可靠的当前时间来支持,尽管大多数服务器的时间是非常准确的,我们使用time()来获取的时间是可靠的,但未免会有不确切的情况,也有的服务器由于未开启ntp(Network Time Protocol ) 来进行时间同步,再由于硬件环境等因素,导致时间五花八门,这在通常,也就差个几分钟、最多几个小时的情况是无可厚非的,因为在同一个网站使用的是同一个 时间,可是有的时候这样很糟糕。在internet上,有免费专门提供UTC时间校正的授时服务器,使用NTP协议,这个可以参考前面的链接来获取更多知 识。他提供的时间误差在20ms左右(不要说在数据传输过程中会耗费的时间不等,NTP早就考虑到了这一点),因此通过这种授时服务器,我们就能得非常可 信的当前时间。

我们现在就来看看用PHP怎么获取到非常精准的UTC时间,由于NTP协议稍微有一点点的不好用,我们有一个更好的协议可以用,他就是Daytime Protocol协议,通过这个协议我们可以直接得到文本数据,这样处理起来会更加方便。我们使用time.nist.gov的时间服务,代码非常简单, 用TCP连接它的13端口就可以了。

$fp=fsockopen('time.nist.gov',13,$errno,$errstr,90);
echo fread($fp,2010);

获得到的数据类似于这样的:

55545 10-12-15 21:40:47 00 0 0 113.1 UTC(NIST) *

这个串的每个部分都有意义,具体的请参看:http://www.nist.gov/pml/div688/grp40/its.cfm ,现在我们只关心中间的部分和113.1前面的那个0,它表示服务器的健康状况,也反映当前的时间是否可信。

OK了,用PHP实现获得准确的UTC时间,这个应用在对时间要求非常苛刻的场合还是很有价值的,到此,我的问题也算解决了。

知道了UTC 标准时间, 剩下的就是转换成世界时间了

$fp=fsockopen('time.nist.gov',13,$errno,$errstr,90);
$ufc = explode(' ',fread($fp,date('Y')));
$date = explode('-',$ufc[1]);
$processdate = $date[1].'-'.$date[2].'-'. date('Y').' '.$ufc[2]; switch($ufc[5])
{
case 0: echo '精确'; break; case 1: echo '误差:0-5s'; break; case 2: echo '误差: > 5s'; break; default: echo '硬件出错!'; break;
} echo gmttolocal($processdate,8); // 中国 function gmttolocal($mydate,$mydifference)
{
$datetime = explode(" ",$mydate);
$dateexplode = explode("-",$datetime[0]);
$timeexplode = explode(":",$datetime[1]);
$unixdatetime = mktime($timeexplode[0]+$mydifference,$timeexplode[1],$timeexplode[2],$dateexplode[0],$dateexplode[1],$dateexplode[2]);
return date("m/d/Y H:i:s",$unixdatetime);
}

fsockopen 解释:

打开网络的 Socket 链接。
语法: int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);
返回值: 整数
函数种类: 网络系统

内容说明目前这个函数提供二个 Socket 资料流界面,分别为 Internet 用的 AF_INET 及 Unix 用的 AF_UNIX。当在 Internet 情形下使用时,参数 hostname 及 port 分别代表网址及埠号。在 UNIX 情形可做 IPC,hostname 参数表示到 socket 的路径,port 配置为 0。可省略的 timeout 选项表示多久没有连上就中断。在使用本函数之后会返回文件指针,供文件函数使用,包括 fgets()、fgetss()、fputs()、fclose() 与 feof()。参数 errno 及 errstr 也是可省略的,主要当做错误处理使用。使用本函数,会使用搁置模式 (blocking mode) 处理,可用 set_socket_blocking() 转换成无搁置模式。

原文:https://justcoding.iteye.com/blog/843645

php获得可靠的精准的当前时间 ( 通过授时服务器 )的更多相关文章

  1. RHEL7 -- 使用Chrony设置时间与时钟服务器同步

    Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成:chronyd和chronyc. chronyd是一个后台运行的守护进程,用于调整内核 ...

  2. 修改系统时间(取得服务器时间,使用SetLocalTime API函数,需要UAC权限)

    我的客户遇到系统时间不对,自己又不会改,于是想到利用服务端时间来修改本地的系统时间. 第一步,把下面xml存成uac.xml文件备用. <?xml version="1.0" ...

  3. 同步windows时间到linux服务器

    输入date -R 查看系统时间 输入命令  ntpdate time.windows.com 同步windows时间到linux

  4. liunx 时间ntp同步服务器

    1.root 用户下安装 yum install ntp -y 报错如下: 29 Apr 00:25:04 ntpdate[8786]: the NTP socket is in use, exiti ...

  5. 查看哪个用户、IP、什么时间登陆过服务器

    2019-01-07 utmpdump /var/log/wtmp 或者 who /var/log/wtmp

  6. 同步网络时间到linux服务器(先修改时区再进行同步网络时间)

    查看时区:date -R 修改整个系统时区: rm -f /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 网 ...

  7. socket编程之时间回射服务器

    使用到的函数: // 返回值:读到的字节数,若已到文件尾,返回0:若出错,返回-1 ssize_t read(int fd, void *buf, size_t nbytes); // 返回值:若成功 ...

  8. 用一杯茶时间搭建Gitea服务器

     一.简单介绍 Gitea搭建局域网内的基于git的代码托管服务器,可以实现的功能包括:组织管理.团队管理.组织仓库设定.团队仓库分配.组织及团队权限分配管理.仓库添加PC协作者.仓库添加组织团队.分 ...

  9. php获取当地时间 time zone

      PHP5.2.4之前的版本无需设置时区.下面是修改PHP时区的三个办法. 1.修改PHP.ini这个文件 找到date.timezone这行,去掉前面的分号,改成: Java代码 date.tim ...

随机推荐

  1. shell- 字符串处理 、 扩展的脚本技巧 、 正则表达式

    字符串截取的方法 方法一:使用${}表达式 格式:${var:起始位置:长度} 方法二:使用expr substr 格式:expr substr "$var" 起始位置 长度 方法 ...

  2. yarn client中的一个BUG的修复

    org.apache.spark.deploy.yarn.Client.scala中的monitorApplication方法: /** * Report the state of an applic ...

  3. (转)spring计划任务,springMvc计划任务,Spring@Scheduled,spring定时任务

    一.计划任务实现类 1.用@Component注解标识计划任务类,这样spring可以自动扫描 2.在方法中使用注解标识要执行的方法:@Scheduled(cron="*/30 * * * ...

  4. linux中 /dev/null命令

    /dev/null :代表空设备文件 >  :代表重定向到哪里,例如:echo "123" > /home/123.txt1  :表示stdout标准输出,系统默认值是 ...

  5. gerrit上的commit msg中关联jira单号(含gerrit的安装)

    这个问题折腾了很久,前期后后大概一个月吧,终于搞定了,查了很多资料,有的不完整,有的完全就不能用,有的没说完整,所以一定要记录下来,我的心血啊. 由于公司在用的gerrit的是正式环境中的,大家都在使 ...

  6. node微信公众号开发--设置自定义菜单

    var request = require("request"); const querystring = require("querystring"); re ...

  7. async await的用法

    const fs = require('fs'); const readFile = function (fileName) { return new Promise(function (resolv ...

  8. cocos2d-x JS 纯代码加载播放plist与png动画

    var cache = cc.spriteFrameCache; cache.addSpriteFrames(plist, png); var frames = []; for (var i = 1; ...

  9. unity3d-代码控制游戏角色控制器移动

    先上一个gif看看效果.因为图片大小限制.所以录制的比较小.个人认为效果比较牵强.特别是里面的逻辑代码. 不过我还是认为一切是为了先实现,因为我是刚接触的新手. 工程结构图 这次实现的效果是: 1:摄 ...

  10. 记录一则完整的SPA(10g->11g)测试过程

    生产端:Windows 2008 + Oracle 10.2.0.5 测试端:RHEL 6.5 + Oracle 11.2.0.4 需求:因为Oracle跨越大版本,优化器.新特性变动较多,需要进行S ...