 
- Perl 基础知识
- Perl - 主页
- Perl - 简介
- Perl - 环境
- Perl - 语法概述
- Perl - 数据类型
- Perl - 变量
- Perl - 标量
- Perl - 数组
- Perl - 哈希
- Perl - IF...ELSE
- Perl - 循环
- Perl - 运算符
- Perl - 日期和时间
- Perl - 子例程
- Perl - 参考资料
- Perl - 格式
- Perl - 文件 I/O
- Perl - 目录
- Perl - 错误处理
- Perl - 特殊变量
- Perl - 编码标准
- Perl - 正则表达式
- Perl - 发送电子邮件
- Perl 高级
- Perl - 套接字编程
- Perl - 面向对象
- Perl - 数据库访问
- Perl - CGI 编程
- Perl - 包和模块
- Perl - 流程管理
- Perl - 嵌入式文档
- Perl - 函数参考
- Perl 有用资源
- Perl - 问题与解答
- Perl - 快速指南
- Perl - 有用的资源
- Perl - 讨论
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