Perl語言中處理Perl日期時(shí)間的技巧
本文和大家重點(diǎn)討論一下處理Perl日期時(shí)間的技巧,這里主要從兩個(gè)方面來向大家介紹,相信通過本文的學(xué)習(xí)你對Perl日期時(shí)間的處理方法有一定的認(rèn)識(shí)。
處理Perl日期時(shí)間的技巧
Perl日期時(shí)間中表現(xiàn)日期的方法多種多樣:
“18 Jan 1973″ ,”18/01/1973″ ,”01/18/1973″ ,”Jan 18 1973″ ,”18-01-73″ ,”18-01-1973″ ,”01/73″,其中一些格局含義不清(如”01-06-1973″是表現(xiàn)6月1日呢,還是表現(xiàn)1月6日呢?) 假如不規(guī)定日期的表現(xiàn)情勢,是很難處理的。
想懂得”18 Jan 1973″和”6 Sep 1950″之間的差別,需要把它們轉(zhuǎn)換為數(shù)字表現(xiàn)。Unix 內(nèi)部應(yīng)用紀(jì)元秒表現(xiàn)時(shí)間。日期和時(shí)間加起來表現(xiàn)之自格林威志時(shí)間1970年1月1日午夜時(shí)分(紀(jì)元)到當(dāng)前時(shí)刻之間的秒數(shù)。”18 Jan 1973″ (假定為午夜時(shí)分) 的紀(jì)元秒為96163200。在該系統(tǒng)中,午夜表現(xiàn)一天的開端時(shí)刻。
讓我們天生一個(gè)日期通過Perl中供給的gmtime函數(shù),你可以自己來驗(yàn)證這點(diǎn)。給定一個(gè)用以表現(xiàn)自從紀(jì)元以來的秒數(shù)的整數(shù),通過gmtime函數(shù)可以盤算出代表相應(yīng)的日期和時(shí)刻,例如:
perl -le ‘print scalar gmtime 96163200′
Thu Jan 18 00:00:00 1973
調(diào)用 gmtime() 函數(shù),你會(huì)得到一系列值的列表,包含時(shí),分,秒, 日期,月份,年份等等。
perl -le ‘print join(”,”, gmtime 96163200)’
0,0,0,18,0,73,4,17,0
前面3個(gè)0分辨表現(xiàn)秒,分,時(shí)。小時(shí)是從0-23,故下午是12時(shí)往后。第4個(gè)數(shù)表現(xiàn)該月中的天數(shù)(本例中為18號(hào))。第5個(gè)數(shù)表現(xiàn)月份,從0開端(代表1月份)。之所以從0開端,是由于月份對應(yīng)著月份數(shù)組的下標(biāo):
@months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); $month = (gmtime 96163200)[4]; # “Jan”
◆年份 (本例中為73)的表現(xiàn)有點(diǎn)特別。它并不是年份的***兩位數(shù)字。它表現(xiàn)從1900年開端的年份。為什么要這樣表現(xiàn)呢?這是由于 C語言就是這樣處理的。Perl試圖使得其庫和系統(tǒng)調(diào)用盡量接近把持系統(tǒng)的處理方法。
所以,假如你想輸出4位數(shù)的年份,表現(xiàn)如下:
$year = (gmtime 96163200)[5] + 1900;
假如你不懂得這種處理方法,就會(huì)制作出Y2K標(biāo)題,你也許會(huì)這樣寫:
$year = “19″ . (gmtime 96163200)[5];
# 出錯(cuò)! 2000年將變?yōu)?9100
對于gmtime()函數(shù)的返回值還沒有先容完,還有4, 17, 和 0這3個(gè)數(shù)。它們分辨表現(xiàn)一星期中的第幾天 (星期日為0),一年中的第幾天(0 表現(xiàn)一年中的***天), 以及是否采用夏時(shí)制(表現(xiàn)不采用,正數(shù)表現(xiàn)采用,負(fù)數(shù)表現(xiàn)不可知)。
Perl中的time() 函數(shù)返回以紀(jì)元秒情勢表現(xiàn)確當(dāng)前日期和時(shí)間。假如你打算把它轉(zhuǎn)換為字符串,就可應(yīng)用gmtime() 和localtime() 函數(shù):
$now = localtime(time());
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(time());
假如調(diào)用 localtime() 或gmtime() 時(shí)不帶參數(shù),它將自己調(diào)用time()
$now = localtime();
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime();
Perl日期時(shí)間中常見的日期和時(shí)間把持
◆假如你打算盤算兩個(gè)時(shí)刻之間的時(shí)間段,只需將它們轉(zhuǎn)換為相應(yīng)的紀(jì)元秒,然后兩數(shù)相減即可:
$difference_in_seconds = $later_datetime -$earlier_datetime;
要把秒轉(zhuǎn)換為分,時(shí),或天數(shù),只需要分辨將它們除以60, 3600 和 86400 即可:
$difference_in_minutes = $difference_in_seconds / 60;
$difference_in_hours = $difference_in_seconds / 3600;
$difference_in_day = $difference_in_seconds / 86400;
反過來做,你也可以答復(fù)如下標(biāo)題:”4天后是幾號(hào)?”:
$then = time() + 86400 * 4;
print scalar localtime $then;
它給出的答案準(zhǔn)確到秒。例如,假如4天后的紀(jì)元秒值為932836935, 你可以輸出日期的字符串如下;
Sat Jul 24 11:23:17 1999
◆假如你打算輸出那個(gè)日期的午夜時(shí)分 (如”Sat Jul 24 00:00:00 1999″) 應(yīng)用如下模塊:$then = $then - $then % 86400; # 往掉那個(gè)日期的尾巴
類似地,你可以用四舍五進(jìn)法,輸出最靠近午夜時(shí)分的日期:
$then += 43200; # add on half a day
$then = $then - $then % 86400;# truncate to the day
◆假如你的時(shí)區(qū)間隔GMT為相差偶數(shù)個(gè)小時(shí),這就管用了。并不是所有的時(shí)區(qū)都是很輕易處理的。你所真正需要的是在你自己的時(shí)區(qū)內(nèi)盤算紀(jì)元秒,而不是在GMT中盤算。
Perl 中的名為Time::Local的模塊,可以供給兩個(gè)函數(shù) timelocal() 和timegm()。其返回值同 localtime() 和gmtime() 一樣。
- use Time::Local;
- $then = time() + 4*86400;
- $then = timegm localtime $then;
- # local epoch seconds
- $then -= $then % 86400;
- # truncate to the day
- $then = timelocal gmtime $then;
- # back to gmt epoch seconds
- print scalar localtime $then, “\n”;
【編輯推薦】