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。GMT 中没有夏令时。

您应该注意以下事实:localtime() 将返回运行脚本的计算机上的当前本地时间,而 gmtime() 将返回通用格林威治标准时间,或 GMT(或 UTC)。

尝试以下示例以 GMT 刻度打印当前日期和时间 -

#!/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