能夠操控日期和時間對於大多數程式設計語言來說是基本的能力,Perl也不例外。但是在碰到與時間相關的更加複雜的處理時,Perl內建的功能常常就顯得力不從心了。在這種情況下,上Perl綜合典藏網(CPAN)看看是一個好主意,上面有很多隨時可以使用的Perl模組,讓開發人員能夠有效地進行日期和時間操作。花點時間瀏覽這個網站看看是否能夠找到一些在下一個項目裡用得上的東西是值得的。
本文列出了Perl CPAN上用來操控日期和時間的10個最有趣的模組,為您下一次轉化時區和計算兩個時間戳記之間的秒數打下了基礎,現在我們就來看看它們。
註:您可以根據下面提供的方法直接從Internet上安裝CPAN模組。
Date::Manip
這個模組被稱為日期操控模組的“瑞士軍刀”。它提供的常式可以用來分析和比較日期,提取日期資訊,確定日期資訊,確定日期/時間偏量,使用重複日期和時間,以及在不同語言裡使用日期等。但是它運行起來要比其他更加專業的模組慢。
當您需要一個通用的日期操控模組且不特別關心效能的時候使用這個模組。
DateTime
這個模組是Perl的DateTime項目的一部分,它提供了一個基類,用以“代表日期/時間的組合”。它是建立自訂日期(Date)對象的最方便的方法,並且包括了用於分析、格式化、計算期間和操控時區的模組。
一般來說,在需要本地化或者定義用於時間資訊的自訂儲存容器的時候,您要將這個模組用作建立與日期相關的新對象。
Time::Format
在需要重新格式化日期和時間值的時候,這個模組是無可匹敵的——它支援大量格式化代碼,能夠大幅改變日期和時間的外觀。它同時接受DateTime對象和Date::Manip字串,還為加入的控制項提供了到POSIX的strftime()函數的介面。
當您需要格式化日期和時間值的時候(通常是在將它們顯示給應用程式使用者之前)使用這個模組。
Time::Interval
這個模組對於處理時間間隔十分有用。它提供的常式可以計算兩個時間戳記之間的日、小時、分鐘和秒的總數。它還可以輕鬆地將時間長度轉換成不同的時間單位,例如秒、小時,或者分鐘。
當您需要計算兩個日期值之間所流逝的時間時使用這個模組。
Date::Convert
這個模組提供的常式用於在不同的日期格式(陽曆、儒略曆、猶太曆、伊斯蘭曆和絕對曆)之間轉換。它還提供掛鈎用以輕鬆擴充到新的日曆格式。
當您需要從一個日曆格式轉換到另外一個日曆格式的時候使用這個模組。
Benchmark
這個模組允許您多次運行同一段代碼,計算執行每次啟動並執行時間並返回所取得的平均值。它還可以被用來查看一個代碼塊可以在固定的時間窗裡運行多少次。
在進行效能基準測試,測量某個代碼塊啟動並執行速度,以及收集精確的讀數以指導您進行最佳化的時候使用這個模組。
Time::Normalize
這個模組提供的常式用來把任意日期和時間值格式化成一個統一的、標準的表示,它然後可以被用來進行計算或者儲存。它會對輸入的內容進行錯誤檢查,然後以清楚的格式返回獨立的時間和/或日期組件。
當您懷疑輸入的日期有錯誤並需要在資料庫或者應用程式裡使用它之前“清理乾淨”的時候使用這個模組。
Regexp::Common::time
這個模組會建立可以用被用來分析日期和時間的Regex。它支援同時使用精確的規則和複雜的模糊邏輯從字串值捕捉日期模式。
用這個模組從人們易於理解的字串識別和提取日期資訊,並將它轉換成機器可讀的格式(例如ISO 8601)。
MySQL::DateFormat
這個模組提供的常式可以把日期和數字在MySQL的YYYY-MM-DD格式和人們易於理解的字串之間來迴轉換。在從/到MySQL資料庫取回/添加含有日期資訊的記錄時這個模組十分有用。
為了以可讀性更強的方式顯示,或者在將它插入MySQL資料庫之前修改使用者提供的日期值,您可以使用這個模組來重新格式化MySQL的日期/時間字串。
Net::Time
這個模組提供了一個從遠程用戶端取回日期和時間資訊的用戶端介面。如果您的應用程式要總是確保知道當前的日期和時間,以保證系統不被駭客窺探,這就顯得尤其有用。
在通過TCP網路從遠程主機上取回日期/時間字串的時候要使用這個模組。
使用樣本:
取得某一日期時間的資訊
方法一
複製代碼 代碼如下:
use POSIX qw(strftime);
localtime(time() - 24*60*60)
strftime "%Y%m%d%k%M%S",localtime $^T;
方法二
複製代碼 代碼如下:
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');