大北风 發表於 2020-6-19 21:46:00

Delphi日期时间 UNIX [转]

<p>Delphi日期时间,就是常见的&nbsp;2014-05-02 10:37:35</p>
<p>--------------------------------------------------------------------</p>
<p>UNIX日期时间,一个整数,从1970/01/01 开始的秒数,int64位</p>
<p>-------------------------------------------------------------------</p>
<p>标准UTC时间,&nbsp;</p>
<p>世界统一时间,世界标准时间,国际协调时间,简称UTC&nbsp;<br><br>不属于任意时区&nbsp;<br><br>中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8。</p>
<p>-------------------------------------------==============</p>
<p>时区,北京是东8区,就是要加 8个小时,8*60*60=28800</p>
<p>&nbsp;</p>
<p>注册表有个日期值,1398998255</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.FormCreate(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Memo1.Clear;
</span><span style="color: rgba(0, 0, 255, 1)">with</span> TRegistry.<span style="color: rgba(0, 0, 255, 1)">Create</span>(KEY_WOW64_64KEY <span style="color: rgba(0, 0, 255, 1)">or</span> KEY_ALL_ACCESS) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    RootKey :</span>=<span style="color: rgba(0, 0, 0, 1)"> HKEY_LOCAL_MACHINE;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> OpenKey(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SOFTWARE\Microsoft\Windows NT\CurrentVersion</span><span style="color: rgba(128, 0, 0, 1)">'</span>, False) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Memo1.Lines.Add(IntToStr(ReadInteger(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">InstallDate</span><span style="color: rgba(128, 0, 0, 1)">'</span>)));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1398998255</span>
      Memo1.Lines.Add(DateTimeToStr(UnixToDateTime(ReadInteger(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">InstallDate</span><span style="color: rgba(128, 0, 0, 1)">'</span>))));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2014-05-02 2:37:35</span>
      Memo1.Lines.Add(DateTimeToStr(UnixToDateTime(ReadInteger(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">InstallDate</span><span style="color: rgba(128, 0, 0, 1)">'</span>) + <span style="color: rgba(128, 0, 128, 1)">28800</span>))); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2014-05-02 10:37:35</span>
      Memo1.Lines.Add(DateTimeToStr(JavaToDelphiDateTime(ReadInteger(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">InstallDate</span><span style="color: rgba(128, 0, 0, 1)">'</span>))));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1970-01-17 12:36:38</span>
    <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    Free
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>&nbsp;</p>
<p>Unix时间戳转换成Delphi的TDateTime</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span> UnixDateToDateTime(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> USec: Longint): TDateTime;
</span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)">
cUnixStartDate: TDateTime </span>= <span style="color: rgba(128, 0, 128, 1)">25569.0</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1970/01/01</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= (Usec / <span style="color: rgba(128, 0, 128, 1)">86400</span>) +<span style="color: rgba(0, 0, 0, 1)"> cUnixStartDate;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Unix date conversion support </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)"> RTL
HoursPerDay </span>= <span style="color: rgba(128, 0, 128, 1)">24</span>;MinsPerHour   = <span style="color: rgba(128, 0, 128, 1)">60</span>;SecsPerMin    = <span style="color: rgba(128, 0, 128, 1)">60</span>;MSecsPerSec   = <span style="color: rgba(128, 0, 128, 1)">1000</span>;MinsPerDay    = HoursPerDay * MinsPerHour;SecsPerDay    = MinsPerDay * SecsPerMin;MSecsPerDay   = SecsPerDay *<span style="color: rgba(0, 0, 0, 1)"> MSecsPerSec;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Days between 1/1/0001 and 12/31/1899 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">

DateDelta </span>= <span style="color: rgba(128, 0, 128, 1)">693594</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Days between TDateTime basis (12/31/1899) and Unix time_t basis (1/1/1970) </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">

UnixDateDelta </span>= <span style="color: rgba(128, 0, 128, 1)">25569</span><span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 0, 255, 1)">function</span> DateTimeToUnix(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AValue: TDateTime): Int64;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= Round((AValue - UnixDateDelta) *<span style="color: rgba(0, 0, 0, 1)"> SecsPerDay);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span> UnixToDateTime(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> AValue: Int64): TDateTime;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= AValue / SecsPerDay +<span style="color: rgba(0, 0, 0, 1)"> UnixDateDelta;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>Unix时间戳(Unix timestamp)转换工具</p>
<p>http://tool.chinaz.com/Tools/unixtime.aspx</p>
<hr>
<p>&nbsp;</p>
<h1 class="title-article">Delphi中获取Unix时间戳及注意事项</h1>
<p>http://blog.csdn.net/missmecn/article/details/5870639</p>
<p>uses DateUtils;<br>DateTimeToUnix(Now)</p>
<p>&nbsp;</p>
<p>可以转换到unix时间,但是注意的是,<span style="color: rgba(255, 0, 0, 1)"><strong>它得到的时间比c语言中time()得到的时间大了8*60*60</strong></span><br>这是因为Now是当前时区的时间,c语言中time()是按格林威治时间计算的,<br>北京时间比格林威治时间多了8小时<br>DateTimeToUnix(Now)-8*60*60 就和c语言中time()得到的一样了&nbsp;</p>
<p>&nbsp;</p>
<p>但我进一步研究DateTimeToUnix函数时发现,<span style="color: rgba(0, 0, 255, 1)"><strong>Delphi中的时间没有经过任何的转换,是直接读取系统时间</strong></span></p>
<p>我试着改变当前计算机时区,发现Delphi返回值没有任何改变。</p>
<p>而在C++中,改变计算机时区,则time()返回值也随着改变,这就说明<span style="color: rgba(255, 0, 0, 1)"><strong>C++中标准时间是通过本地时间和当前时区进行计算得来</strong>的。</span></p>
<p>&nbsp;</p>
<p>因此,在Delphi开发时,需要注意Delphi获取的时间戳是当前计算机所在时区时间,并非标准UTC时间。</p>
<p>UnixToDateTime()函数并没有对时区进行转换,仅仅是对时间进行了转换。</p>
<hr>
<p>&nbsp;</p>
<p>获取北京时间的接口:</p>
<p>淘宝:http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp<br>苏宁:http://quan.suning.com/getSysTime.do<br>QQ: http://cgi.im.qq.com/cgi-bin/cgi_svrtime</p>
<hr>
<p>&nbsp;</p>
<p>转自:</p>
<p>https://www.cnblogs.com/CodeGear/p/4760415.html</p>
<p>http://blog.csdn.net/missmecn/article/details/5870639</p>
<p>https://blog.csdn.net/Webben/article/details/104020759</p><br><br>
来源:https://www.cnblogs.com/railgunman/p/13166587.html
頁: [1]
查看完整版本: Delphi日期时间 UNIX [转]