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

GMT (格林威治标准)时间

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

Epoch time

您可以使用 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 AM 或 PM 指定 PM
%r 12 小时制时间 * 02:55:02 pm
%R 24 小时制 HH:MM 时间,相当于 %H:%M 14:55
%S 秒(00-60 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 offset from UTC in timezone (1 minute = 1, 1 hour = 100)

如果时区无法终止,则没有字符

+100
%Z

Timezone name or abbreviation *

如果时区无法终止,则没有字符

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