Perl处理日期时间的技巧
use Time::Local; @months{qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)} = (0..11);
Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved 地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008 电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134 《中华人民共和国增值电信业务经营许可证》闽B2-20100024 ICP备案:闽ICP备05037997号
/(\d\d)\s+(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)/ or die “Not a date”; $mday = $1; $mon = exists($months{$2}) ? $months{$2} : die “Bad month”; $year = $3 - 1900; ($h, $m, $s) = ($4, $5, $6); $epoch_seconds = timelocal($s,$m,$h,$mday,$mon,$year); 一个更通用些的方法,是从CPAN安装Date::Manip 模块。 use Date::Manip; $epoch_seconds = UnixDate(”19 Dec 1997 15:30:02″,”s”); 注意,由于 Date::Manip是个大模块,使用该模块时,将会增加你的程序的启动时间。其中一个原因是 Date::Manip将对多种不同的格式进行识别,如: “today” “now” “first sunday in april 2000″ “3:15, today” “3:15pm, first sunday in april 2000″ “2000/01/18 09:15″Date Manipulation 2036, 2037, 2038, …, 1901?! 大多数C程序把纪元秒存为有符号整数,可表示正的和负的日期,但计算机存储器所表示的整数大小是有限的,用有限的位数来表示秒。这就是说,我们在计算纪元秒时,所表示的日期是有限制的。 确切的限度取决于你的机器所能表示的整数的位数。 Perl最多以32位的长度存储整数。粗略地讲,有一位用来表示正负号,其余31位来表示数。如果8位,你可以存储的最大数是255,即2的8次方减1。故Perl中所存储的32位符号数中的最大数为: print 2**31-1, “\n”; 2147483647 这个数字对应了哪个日期呢? print scalar(gmtime 2**31-1), “\n”; Tue Jan 19 03:14:07 2038 在那个时刻的1秒之后会发生什么呢? print scalar(gmtime 2**31), “\n”; Fri Dec 13 20:45:52 1901 啊!发生了什么?对于32位有符号整数来说, 2**31太大了。它”翻卷过去了”,其符号位被置为负号,因而成为了所能表示的最大负数。这对应于1970年开始时刻之前的秒的最大值。 其结果说明了什么呢?你不能存储gmtime(2**31)之前或gmtime(2**31-1)之后的以纪元秒表示的日期。 你可千万不要想不开,这可不是什么大问题。如果你要用到32位有符号整数表示的纪元秒以外的时间,你只需要改变你的表示方式,你可从CPAN中找到不少日期模块,其中的Date::Calc 和Date::Manip 很可能是功能最强的两个模块。 这两个模块使 |
|||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |