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