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
广告
© . All rights reserved.