<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zend Studio &#187; 精确时间</title>
	<atom:link href="http://www.zendstudio.net/tag/精确时间/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zendstudio.net</link>
	<description>提供zend studio教程、zend studio下载等相关资源的公益性站点。</description>
	<lastBuildDate>Fri, 30 Jul 2010 06:05:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用php获得可靠的精准的当前时间通过授时服务器</title>
		<link>http://www.zendstudio.net/archives/get-gmt-time-from-time-server-by-php/</link>
		<comments>http://www.zendstudio.net/archives/get-gmt-time-from-time-server-by-php/#comments</comments>
		<pubDate>Thu, 28 May 2009 09:21:44 +0000</pubDate>
		<dc:creator>gently</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[gmt]]></category>
		<category><![CDATA[utc]]></category>
		<category><![CDATA[授时服务器]]></category>
		<category><![CDATA[精确时间]]></category>

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

比如我的电脑中安装的这个原子时钟，它就具有自动同步时间的功能，因此，我的电脑时间是很可信的。实际上，windows和linux等系统都支持通过NTP协议自动同步时间。

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

$fp=fsockopen&#40;'time.nist.gov',13,$errno,$errstr,90&#41;;
echo fread&#40;$fp,2096&#41;;

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

54979 09-05-28 09:10:50 50 0 0 206.9 UTC&#40;NIST&#41; *

这个串的每个部分都有意义，具体的请参看：http://tf.nist.gov/service/its.htm，现在我们只关心中间的部分和206.9前面的那个0,它表示服务器的健康状况，也反映当前的时间是否可信。
OK了，用PHP实现获得准确的UTC时间，这个应用在对时间要求非常苛刻的场合还是很有价值的，到此，我的问题也算解决了。今天端午节，祝大家节日快乐！

	相关日志
	
	无相关日志
	

]]></description>
			<content:encoded><![CDATA[<p>有一种情形是这样子的，比如机票业务中的订票流程，我们需要一个非常可靠的当前时间来支持，尽管大多数服务器的时间是非常准确的，我们使用time()来获取的时间是可靠的，但未免会有不确切的情况，也有的服务器由于未开启ntp(<a href="http://www.faqs.org/rfcs/rfc1305.html">Network Time Protocol</a>)来进行时间同步，再由于硬件环境等因素，导致时间五花八门，这在通常，也就差个几分钟、最多几个小时的情况是无可厚非的，因为在同一个网站使用的是同一个时间，可是有的时候这样很糟糕。在internet上，有免费专门提供UTC时间校正的授时服务器，使用NTP协议，这个可以参考前面的链接来获取更多知识。他提供的时间误差在20ms左右（不要说在数据传输过程中会耗费的时间不等，NTP早就考虑到了这一点），因此通过这种授时服务器，我们就能得非常可信的当前时间。</p>
<p><span id="more-706"></span></p>
<p>比如我的电脑中安装的这个<strong>原子时钟</strong>，它就具有自动同步时间的功能，因此，我的电脑时间是很可信的。实际上，windows和linux等系统都支持通过NTP协议自动同步时间。</p>
<p><a href="http://www.zendstudio.net/wp-content/uploads/2009/05/atomic-clock.png"><img class="alignnone size-full wp-image-707" title="atomic-clock" src="http://www.zendstudio.net/wp-content/uploads/2009/05/atomic-clock.png" alt="atomic-clock" width="538" height="391" /></a></p>
<p>我们现在就来看看用PHP怎么获取到非常精准的UTC时间，由于NTP协议稍微有一点点的不好用，我们有一个更好的协议可以用，他就是Daytime Protocol协议，通过这个协议我们可以直接得到文本数据，这样处理起来会更加方便。我们使用time.nist.gov的时间服务，代码非常简单，用TCP连接它的13端口就可以了。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$fp</span><span style="color: #339933;">=</span><span style="color: #990000;">fsockopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'time.nist.gov'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">13</span><span style="color: #339933;">,</span><span style="color: #000088;">$errno</span><span style="color: #339933;">,</span><span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">90</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2096</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>获得到的数据类似于这样的：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #cc66cc;">54979</span> <span style="color:#800080;">09</span><span style="color: #339933;">-</span><span style="color: #208080;">05</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">28</span> <span style="color:#800080;">09</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">50</span> <span style="color: #cc66cc;">50</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color:#800080;">206.9</span> UTC<span style="color: #009900;">&#40;</span>NIST<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span></pre></div></div>

<p>这个串的每个部分都有意义，具体的请参看：<a href="http://tf.nist.gov/service/its.htm">http://tf.nist.gov/service/its.htm</a>，现在我们只关心中间的部分和206.9前面的那个0,它表示服务器的健康状况，也反映当前的时间是否可信。</p>
<p>OK了，用PHP实现获得准确的UTC时间，这个应用在对时间要求非常苛刻的场合还是很有价值的，到此，我的问题也算解决了。今天端午节，祝大家节日快乐！</p>

	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li>无相关日志</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zendstudio.net/archives/get-gmt-time-from-time-server-by-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
