能夠操控日期和時間對于大多數(shù)編程語言來說是基本的能力,Perl也不例外。但是在碰到與時間相關(guān)的更加復(fù)雜的處理時,Perl自帶的功能常常就顯得力不從心了。在這種情況下,上Perl綜合典藏網(wǎng)(CPAN)看看是一個好主意,上面有很多隨時可以使用的Perl模塊,讓開發(fā)人員能夠有效地進行日期和時間操作?;c時間瀏覽這個網(wǎng)站看看是否能夠找到一些在下一個項目里用得上的東西是值得的。
本文列出了Perl CPAN上用來操控日期和時間的10個最有趣的模塊,為您下一次轉(zhuǎn)化時區(qū)和計算兩個時間戳之間的秒數(shù)打下了基礎(chǔ),現(xiàn)在我們就來看看它們。
注:您可以根據(jù)下面提供的方法直接從Internet上安裝CPAN模塊。
Date::Manip
這個模塊被稱為日期操控模塊的“瑞士軍刀”。它提供的例程可以用來分析和比較日期,提取日期信息,確定日期信息,確定日期/時間偏量,使用重復(fù)日期和時間,以及在不同語言里使用日期等。但是它運行起來要比其他更加專業(yè)的模塊慢。
當您需要一個通用的日期操控模塊且不特別關(guān)心性能的時候使用這個模塊。
DateTime
這個模塊是Perl的DateTime項目的一部分,它提供了一個基類,用以“代表日期/時間的組合”。它是創(chuàng)建自定義日期(Date)對象的最方便的方法,并且包括了用于分析、格式化、計算持續(xù)時間和操控時區(qū)的模塊。
一般來說,在需要本地化或者定義用于時間信息的自定義存儲容器的時候,您要將這個模塊用作創(chuàng)建與日期相關(guān)的新對象。
Time::Format
在需要重新格式化日期和時間值的時候,這個模塊是無可匹敵的——它支持大量格式化代碼,能夠大幅改變?nèi)掌诤蜁r間的外觀。它同時接受DateTime對象和Date::Manip字符串,還為加入的控件提供了到POSIX的strftime()函數(shù)的接口。
當您需要格式化日期和時間值的時候(通常是在將它們顯示給應(yīng)用程序用戶之前)使用這個模塊。
Time::Interval
這個模塊對于處理時間間隔十分有用。它提供的例程可以計算兩個時間戳之間的日、小時、分鐘和秒的總數(shù)。它還可以輕松地將時長轉(zhuǎn)換成不同的時間單位,例如秒、小時,或者分鐘。
當您需要計算兩個日期值之間所流逝的時間時使用這個模塊。
Date::Convert
這個模塊提供的例程用于在不同的日期格式(陽歷、儒略歷、猶太歷、伊斯蘭歷和絕對歷)之間轉(zhuǎn)換。它還提供掛鉤用以輕松擴展到新的日歷格式。
當您需要從一個日歷格式轉(zhuǎn)換到另外一個日歷格式的時候使用這個模塊。
Benchmark
這個模塊允許您多次運行同一段代碼,計算執(zhí)行每次運行的時間并返回所取得的平均值。它還可以被用來查看一個代碼塊可以在固定的時間窗里運行多少次。
在進行性能基準測試,測量某個代碼塊運行的速度,以及收集精確的讀數(shù)以指導(dǎo)您進行優(yōu)化的時候使用這個模塊。
Time::Normalize
這個模塊提供的例程用來把任意日期和時間值格式化成一個統(tǒng)一的、標準的表示,它然后可以被用來進行計算或者保存。它會對輸入的內(nèi)容進行錯誤檢查,然后以清楚的格式返回獨立的時間和/或日期組件。
當您懷疑輸入的日期有錯誤并需要在數(shù)據(jù)庫或者應(yīng)用程序里使用它之前“清理干凈”的時候使用這個模塊。
Regexp::Common::time
這個模塊會創(chuàng)建可以用被用來分析日期和時間的正則表達式。它支持同時使用精確的規(guī)則和復(fù)雜的模糊邏輯從字符串值捕捉日期模式。
用這個模塊從人們易于理解的字符串識別和提取日期信息,并將它轉(zhuǎn)換成機器可讀的格式(例如ISO 8601)。
MySQL::DateFormat
這個模塊提供的例程可以把日期和數(shù)字在MySQL的YYYY-MM-DD格式和人們易于理解的字符串之間來回轉(zhuǎn)換。在從/到MySQL數(shù)據(jù)庫取回/添加含有日期信息的記錄時這個模塊十分有用。
為了以可讀性更強的方式顯示,或者在將它插入MySQL數(shù)據(jù)庫之前修改用戶提供的日期值,您可以使用這個模塊來重新格式化MySQL的日期/時間字符串。
Net::Time
這個模塊提供了一個從遠程客戶端取回日期和時間信息的客戶端接口。如果您的應(yīng)用程序要總是確保知道當前的日期和時間,以保證系統(tǒng)不被黑客窺探,這就顯得尤其有用。
在通過TCP網(wǎng)絡(luò)從遠程主機上取回日期/時間字符串的時候要使用這個模塊。
使用示例:
取得某一日期時間的信息
方法一
復(fù)制代碼 代碼如下:
use POSIX qw(strftime);
localtime(time() - 24*60*60)
strftime "%Y%m%d%k%M%S",localtime $^T;
方法二
復(fù)制代碼 代碼如下:
use 5.010;
use POSIX qw(strftime);
# These are core modules in Perl 5.10 and newer
use Time::Piece;
use Time::Seconds;
my $yesterday = localtime() - ONE_DAY;
say $yesterday->strftime('%b %d %Y');