Perl语言中处理Perl日期时间的技巧

本文和大家重点讨论一下处理Perl日期时间的技巧,这里主要从两个方面来向大家介绍,相信通过本文的学习你对Perl日期时间的处理方法有一定的认识。

处理Perl日期时间的技巧

Perl日期时间中表现日期的方法多种多样:

“18 Jan 1973″ ,”18/01/1973″ ,”01/18/1973″ ,”Jan 18 1973″ ,”18-01-73″ ,”18-01-1973″ ,”01/73″,其中一些格局含义不清(如”01-06-1973″是表现6月1日呢,还是表现1月6日呢?) 假如不规定日期的表现情势,是很难处理的。

想懂得”18 Jan 1973″和”6 Sep 1950″之间的差别,需要把它们转换为数字表现。Unix 内部应用纪元秒表现时间。日期和时间加起来表现之自格林威志时间1970年1月1日午夜时分(纪元)到当前时刻之间的秒数。”18 Jan 1973″ (假定为午夜时分) 的纪元秒为96163200。在该系统中,午夜表现一天的开端时刻。

让我们天生一个日期通过Perl中供给的gmtime函数,你可以自己来验证这点。给定一个用以表现自从纪元以来的秒数的整数,通过gmtime函数可以盘算出代表相应的日期和时刻,例如:
perl -le ‘print scalar gmtime 96163200′
Thu Jan 18 00:00:00 1973
调用 gmtime() 函数,你会得到一系列值的列表,包含时,分,秒, 日期,月份,年份等等。
perl -le ‘print join(”,”, gmtime 96163200)’
0,0,0,18,0,73,4,17,0
前面3个0分辨表现秒,分,时。小时是从0-23,故下午是12时往后。第4个数表现该月中的天数(本例中为18号)。第5个数表现月份,从0开端(代表1月份)。之所以从0开端,是由于月份对应着月份数组的下标:
@months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); $month = (gmtime 96163200)[4]; # “Jan”

◆年份 (本例中为73)的表现有点特别它并不是年份的最后两位数字。它表现从1900年开端的年份。为什么要这样表现呢?这是由于 C语言就是这样处理的。Perl试图使得其库和系统调用尽量接近把持系统的处理方法。
所以,假如你想输出4位数的年份,表现如下:
$year = (gmtime 96163200)[5] + 1900;
假如你不懂得这种处理方法,就会制作出Y2K标题,你也许会这样写:
$year = “19″ . (gmtime 96163200)[5];
# 出错! 2000年将变为19100

对于gmtime()函数的返回值还没有先容完,还有4, 17, 和 0这3个数。它们分辨表现一星期中的第几天 (星期日为0),一年中的第几天(0 表现一年中的第一天), 以及是否采用夏时制(表现不采用,正数表现采用,负数表现不可知)。
Perl中的time() 函数返回以纪元秒情势表现确当前日期和时间。假如你打算把它转换为字符串,就可应用gmtime() 和localtime() 函数:
$now = localtime(time());
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(time());
假如调用 localtime() 或gmtime() 时不带参数,它将自己调用time()
$now = localtime();
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime();

Perl日期时间中常见的日期和时间把持

◆假如你打算盘算两个时刻之间的时间段,只需将它们转换为相应的纪元秒,然后两数相减即可:
$difference_in_seconds = $later_datetime -$earlier_datetime;

要把秒转换为分,时,或天数,只需要分辨将它们除以60, 3600 和 86400 即可:
$difference_in_minutes = $difference_in_seconds / 60;
$difference_in_hours = $difference_in_seconds / 3600;
$difference_in_day = $difference_in_seconds / 86400;

反过来做,你也可以答复如下标题:”4天后是几号?”:
$then = time() + 86400 * 4;
print scalar localtime $then;
它给出的答案准确到秒。例如,假如4天后的纪元秒值为932836935, 你可以输出日期的字符串如下;
Sat Jul 24 11:23:17 1999

◆假如你打算输出那个日期的午夜时分 (如”Sat Jul 24 00:00:00 1999″) 应用如下模块:$then = $then - $then % 86400;      # 往掉那个日期的尾巴
类似地,你可以用四舍五进法,输出最靠近午夜时分的日期:
$then += 43200; # add on half a day
$then = $then - $then % 86400;# truncate to the day

相关推荐