- 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。格林尼治标准时间没有夏令时。
您应该注意,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