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