本章将为您提供有关如何在Perl中处理和操作日期和时间的基本知识.
当前日期和时间
让我们来看看从 localtime()函数开始,如果没有参数,则返回当前日期和时间的值.以下是 localtime 函数返回的9元素列表,在列表上下文中使用 :
sec, # seconds of minutes from 0 to 61min, # minutes of hour from 0 to 59hour, # hours of day from 0 to 24mday, # day of month from 1 to 31mon, # month of year from 0 to 11year, # year since 1900wday, # days since sundayyday, # days since January 1stisdst # 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()函数类似,但返回的值已针对标准格林威治时区进行了本地化.在列表上下文中调用时,$ isdst,gmtime返回的最后一个值始终为0.GMT中没有夏令时.
您应该记录本地时间的事实()将返回运行脚本的机器上的当前本地时间,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:SS06: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 2018Yesterday's date and time Mon Jun 4 05:54:43 2018
POSIX函数strftime()
您可以使用POSIX函数 strftime()在下表的帮助下格式化日期和时间.请注意,标有星号(*)的说明符是与语言环境相关的.
Specifier | 替换为 | 示例 |
---|---|---|
%a | 缩写的工作日名称* | Thu |
%A | 完整工作日名称* | 星期四 |
%b | 缩写的月份名称* | 8月 |
%B | 完整月份名称* | 八月 |
%c | 日期和时间表示* | 周四ug 23 14:55:02 2001 |
%C | 年除以100并截断为整数( 00-99 ) | 20 |
%d | 每月的日期,零填充( 01-31 ) | 23 |
%D | Short MM/DD/YY 日期,相当于%m/%d/%y | 08/23/01 |
%e | 每月的日期,空格填充( 1- 31 ) | 23 |
%F | 短 YYYY-MM-DD 日期,相当于%Y-%m-%d | 2001-08-23 |
%克 | 基于周的年份,最后两位数( 00-99 ) | 01 |
%G | 基于周的年度 | 2001 |
%h | 缩写的月份名称*(与%b 相同) | 8月 |
%H | 24小时格式的小时( 00-23 ) | 14 |
%I | 12小时格式的小时( 01-12 ) | 02 |
%j | 一年中的某一天( 001-366 ) | 235 |
%m | 月份为十进制数字( 01-12 ) | 08 |
%M | 分钟( 00-59 ) | 55 |
%n | New-行字符('\ 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) 如果时区不能是termine d,没有字符 | +100 |
%Z | 时区名称或缩写* 如果时区不能被定义,则没有字符 | CDT |
%% | A % 签收 | % |
让我们检查以下示例以了解使用情况 :
#!/usr/local/bin/perluse 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 2013date and time - Sat Feb 16 14:10:23 2013