Perl - 日期和時間



本章將為您提供關於如何在 Perl 中處理和操作日期和時間的基本理解。

當前日期和時間

讓我們從localtime()函式開始,如果未提供引數,則返回當前日期和時間的數值。以下是localtime函式在列表上下文中返回的9個元素列表:

sec,     # seconds of minutes from 0 to 61
min,     # minutes of hour from 0 to 59
hour,    # hours of day from 0 to 24
mday,    # day of month from 1 to 31
mon,     # month of year from 0 to 11
year,    # year since 1900
wday,    # days since sunday
yday,    # days since January 1st
isdst    # hours of daylight savings time

嘗試以下示例以列印 localtime() 函式返回的不同元素:

#!/usr/local/bin/perl
 
@months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
@days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
print "$mday $months[$mon] $days[$wday]\n";

執行以上程式碼後,將產生以下結果:

16 Feb Sat

如果您在標量上下文中使用 localtime() 函式,則它將返回系統中設定的當前時區的日期和時間。嘗試以下示例以列印完整格式的當前日期和時間:

#!/usr/local/bin/perl
 
$datestring = localtime();
print "Local date and time $datestring\n";

執行以上程式碼後,將產生以下結果:

Local date and time Sat Feb 16 06:50:45 2013

格林尼治標準時間

gmtime()函式的工作方式與localtime()函式類似,但是返回的值已針對標準格林尼治時間區進行了本地化。當在列表上下文中呼叫時,gmtime 返回的最後一個值 $isdst 始終為 0。格林尼治標準時間沒有夏令時。

您應該注意,localtime() 將返回執行指令碼的機器上的當前本地時間,而 gmtime() 將返回通用格林尼治標準時間,或 GMT(或 UTC)。

嘗試以下示例以列印當前日期和時間,但以格林尼治標準時間為準:

#!/usr/local/bin/perl

$datestring = gmtime();
print "GMT date and time $datestring\n";

執行以上程式碼後,將產生以下結果:

GMT date and time Sat Feb 16 13:50:45 2013

格式化日期和時間

您可以使用 localtime() 函式獲取一個包含 9 個元素的列表,然後可以使用printf()函式根據您的要求格式化日期和時間,如下所示:

#!/usr/local/bin/perl
 
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();

printf("Time Format - HH:MM:SS\n");
printf("%02d:%02d:%02d", $hour, $min, $sec);

執行以上程式碼後,將產生以下結果:

Time Format - HH:MM:SS
06:58:52

紀元時間

您可以使用 time() 函式獲取紀元時間,即自給定日期以來經過的秒數,在 Unix 系統中是 1970 年 1 月 1 日。

#!/usr/local/bin/perl
 
$epoc = time();

print "Number of seconds since Jan 1, 1970 - $epoc\n";

執行以上程式碼後,將產生以下結果:

Number of seconds since Jan 1, 1970 - 1361022130

您可以將給定的秒數轉換為日期和時間字串,如下所示:

#!/usr/local/bin/perl

$datestring = localtime();
print "Current date and time $datestring\n";

$epoc = time();
$epoc = $epoc - 24 * 60 * 60;   # one day before of current date.

$datestring = localtime($epoc);
print "Yesterday's date and time $datestring\n";

執行以上程式碼後,將產生以下結果:

Current date and time Tue Jun  5 05:54:43 2018
Yesterday's date and time Mon Jun  4 05:54:43 2018

POSIX 函式 strftime()

您可以使用 POSIX 函式strftime()透過下表中的內容來格式化日期和時間。請注意,標有星號 (*) 的說明符取決於區域設定。

說明符 替換為 示例
%a 縮寫星期幾名稱 * Thu
%A 完整星期幾名稱 * Thursday
%b 縮寫月份名稱 * Aug
%B 完整月份名稱 * August
%c 日期和時間表示 * Thu Aug 23 14:55:02 2001
%C 年份除以 100 並截斷為整數 (00-99) 20
%d 月份中的日期,零填充 (01-31) 23
%D 簡短的 MM/DD/YY 日期,相當於 %m/%d/%y 08/23/01
%e 月份中的日期,空格填充 ( 1-31) 23
%F 簡短的 YYYY-MM-DD 日期,相當於 %Y-%m-%d 2001-08-23
%g 基於周的年份,後兩位數字 (00-99) 01
%G 基於周的年份 2001
%h 縮寫月份名稱 * (與 %b 相同) Aug
%H 24 小時制的小時 (00-23) 14
%I 12 小時制的小時 (01-12) 02
%j 一年中的日期 (001-366) 235
%m 月份作為十進位制數 (01-12) 08
%M 分鐘 (00-59) 55
%n 換行符 ('\n')
%p 上午或下午表示 PM
%r 12 小時制時間 * 02:55:02 pm
%R 24 小時制 HH:MM 時間,相當於 %H:%M 14:55
%S 秒 (00-61) 02
%t 水平製表符 ('\t')
%T ISO 8601 時間格式 (HH:MM:SS),相當於 %H:%M:%S 14:55
%u ISO 8601 星期幾作為數字,星期一為 1 (1-7) 4
%U 星期數,以第一個星期日為第一週的第一天 (00-53) 33
%V ISO 8601 星期數 (00-53) 34
%w 星期幾作為十進位制數,星期日為 0 (0-6) 4
%W 星期數,以第一個星期一為第一週的第一天 (00-53) 34
%x 日期表示 * 08/23/01
%X 時間表示 * 14:55:02
%y 年份,後兩位數字 (00-99) 01
%Y 年份 2001
%z

ISO 8601 與 UTC 的時區偏移量(1 分鐘 = 1,1 小時 = 100)

如果無法確定時區,則無字元

+100
%Z

時區名稱或縮寫 *

如果無法確定時區,則無字元

CDT
%% % 號 %

讓我們檢查以下示例以瞭解其用法:

#!/usr/local/bin/perl
use POSIX qw(strftime);

$datestring = strftime "%a %b %e %H:%M:%S %Y", localtime;
printf("date and time - $datestring\n");

# or for GMT formatted appropriately for your locale:
$datestring = strftime "%a %b %e %H:%M:%S %Y", gmtime;
printf("date and time - $datestring\n");

執行以上程式碼後,將產生以下結果:

date and time - Sat Feb 16 07:10:23 2013
date and time - Sat Feb 16 14:10:23 2013
廣告