php获得可靠的精准的当前时间 ( 通过授时服务器 )
有一种情形是这样子的,比如机票业务中的订票流程,我们需要一个非常可靠的当前时间来支持,尽管大多数服务器的时间是非常准确的,我们使用time()来获取的时间是可靠的,但未免会有不确切的情况,也有的服务器由于未开启ntp(Network Time Protocol ) 来进行时间同步,再由于硬件环境等因素,导致时间五花八门,这在通常,也就差个几分钟、最多几个小时的情况是无可厚非的,因为在同一个网站使用的是同一个 时间,可是有的时候这样很糟糕。在internet上,有免费专门提供UTC时间校正的授时服务器,使用NTP协议,这个可以参考前面的链接来获取更多知 识。他提供的时间误差在20ms左右(不要说在数据传输过程中会耗费的时间不等,NTP早就考虑到了这一点),因此通过这种授时服务器,我们就能得非常可 信的当前时间。
我们现在就来看看用PHP怎么获取到非常精准的UTC时间,由于NTP协议稍微有一点点的不好用,我们有一个更好的协议可以用,他就是Daytime Protocol协议,通过这个协议我们可以直接得到文本数据,这样处理起来会更加方便。我们使用time.nist.gov的时间服务,代码非常简单, 用TCP连接它的13端口就可以了。
1 2 | $fp=fsockopen( 'time.nist.gov' ,13,$errno,$errstr,90); echo fread($fp,2010); |
获得到的数据类似于这样的:
1 | 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 标准时间, 剩下的就是转换成世界时间了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | $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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具