有一种情形是这样子的,比如机票业务中的订票流程,我们需要一个非常可靠的当前时间来支持,尽管大多数服务器的时间是非常准确的,我们使用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
,现在我们只关心中间的部分和206.9前面的那个0,它表示服务器的健康状况,也反映当前的时间是否可信。
OK了,用PHP实现获得准确的UTC时间,这个应用在对时间要求非常苛刻的场合还是很有价值的,到此,我的问题也算解决了。
知道了UTC 标准时间, 剩下的就是转换成世界时间了,参看 php获取当地时间 time zone
$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],0,$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() 转换成无搁置模式。
分享到:
相关推荐
易语言连接授时服务器源码,连接授时服务器,取时间服务器时间
获取网络授时服务器准确时间并将本机时间同步设置,涉及到网络Socket技术,代码精炼,注视清楚,适合学习, VC++6环境编译通过
自动获取国家授时中心服务器时间,并修改系统时间。自动同步时间!
用STM32F103单片机控制SIM900A模块通过连接国外的授时服务器或者访问SIM900A内部获取网络时间,把获得的时间设置到STM32内部的RTC中,实现单片机上电自动校正时间。时间在串口上显示出来。资源是完整的工程,里面...
1.NTP服务的端口是123,使用的是udp协议,所以NTP服务器的防火墙必须对外开放udp 123这个端口。 2.Ntpd启动的时候通常需要一段时间进行时间同步,所以在ntpd刚刚启动的时候还不能正常提供时钟服务,最长大概有5分钟吧...
易语言源码易语言连接授时服务器源码.rar 易语言源码易语言连接授时服务器源码.rar 易语言源码易语言连接授时服务器源码.rar 易语言源码易语言连接授时服务器源码.rar 易语言源码易语言连接授时服务器源码.rar ...
Http协议网络对时工具,使用国家授时中心http服务器提供的标准北京时间,不受网关跨越限制,免去UDP协议对时工具无法穿越网关的烦恼。
计算机时间同步系统PCI授时卡是我公司利用CDMA授时方式设计的计算机时间同步...其时间源于GPS网络,通过CDMA手机服务网络系统传输时间数据,经过中国时间授时中心签定,其信号稳定,同步精度高,可以达到10ms同步精度。
获取NTP服务器授时中心时间源代码。 可以通过阿里云NTP服务器来获得时间,比较稳定。 ntp1.aliyun.com ntp2.aliyun.com ntp3.aliyun.com ntp4.aliyun.com ntp5.aliyun.com ntp6.aliyun.com ntp7.aliyun.com
授时系统时间同步实施方案授时系统时间同步实施方案授时系统时间同步实施方案授时系统时间同步实施方案授时系统时间同步实施方案
易语言取网络时间,标准时间,北京时间,国家授时中心时间 经过实际测试可用
NTP/SNTP 协议的时间服务器, 从 GPS 地球同步卫星上获取标准时钟信号信息,将这些信息通过 TCP/IP 网络传 输,为网络设备(用户)提供精确、标准、安全、可靠和多功能的时间服务,同 时输出 IRIG-B 码信息给用户,...
基于STM32的SNTP授时服务器的研究与设计.pdf
易语言国家授时中心标准时间源码,国家授时中心标准时间,Unix时间戳记反转,Unix时间戳转时间
同时,当前的授时技术是基于单一的授时算法,其需要开阔的观测环境和终端用户处于静止状态,因此对用户的观测环境要求较高,严重制约了智能电网的对于授时可靠性和系统的弹性授时的需求。 基于北斗卫星导航系统...
NTP网络授时系统设计与实现——NTP服务器端授时服务软件设计与实现参考.pdf
SNTM 系列网络时间服务器作为思利敏电力公司系列时间产品单元,内置高精度 OCXO 晶振(可选铷原子)守时,可作为一级、二级甚至多级 PTP/NTP 时间服务器,支持任意扩展, 满足大规模、多方式的时间信号需求。...
(2) 作为SNTP时间服务器:以脉冲和串口数据作为基准时间,对SNTP客户端进行网络授时; 2特点 以太网支持10/100M,全双工/半双工自适应; 与802.3x全双工流控和半双工背压流控兼容; 支持MDI/MDIX线路自动...
电力系统嵌入式NTP授时服务器设计与实现.pdf
利用ntp服务器格式获取网络时间 下面是ntp数据包的格式 NTP packet = NTP header + Four TimeStamps = 48byte NTP header : 16byte +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- |LI | VN |...