Perl 提供了丰富的时间处理函数,主要分为两类:传统的时间函数(来自C标准库)和面向对象的时间模块(如 DateTime)。以下是常用时间处理函数的介绍:
1. 核心时间函数
time()
返回从纪元(1970-01-01 00:00:00 UTC)开始的秒数(时间戳)。
my $timestamp = time(); # 如:1633072800
localtime() 和 gmtime()
将时间戳转换为本地时间或GMT时间的结构化数据。
# 标量上下文:返回可读字符串
my $datetime = localtime(); # "Thu Sep 30 14:20:00 2021"
# 列表上下文:返回时间组成部分
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
# 注意:$mon 范围0-11,$year 从1900开始
my $full_year = $year + 1900;
my $real_mon = $mon + 1;
strftime()
格式化时间输出(需要 use POSIX qw(strftime);):
use POSIX qw(strftime);
my $formatted = strftime("%Y-%m-%d %H:%M:%S", localtime(time()));
# 输出:2021-09-30 14:20:00
2. 时间格式说明符
| 格式符 |
说明 |
示例 |
|---|
| %Y |
四位年份 |
2021 |
| %y |
两位年份 |
21 |
| %m |
月份(01-12) |
09 |
| %d |
日期(01-31) |
30 |
| %H |
24小时制小时 |
14 |
| %I |
12小时制小时 |
02 |
| %M |
分钟(00-59) |
20 |
| %S |
秒数(00-59) |
00 |
| %A |
完整星期名 |
Thursday |
| %a |
简写星期名 |
Thu |
| %B |
完整月份名 |
September |
| %b |
简写月份名 |
Sep |
| %p |
AM/PM |
PM |
3. 常用时间计算
获取特定时间的时间戳
# 使用 timelocal 和 timegm(需要 Time::Local)
use Time::Local;
my $time = timelocal($sec, $min, $hour, $mday, $mon-1, $year-1900);
时间延迟
sleep(5); # 暂停5秒
usleep(500000); # 暂停0.5秒(需要 Time::HiRes)
计算时间差
my $start = time();
# ... 执行操作 ...
my $end = time();
my $elapsed = $end - $start; # 单位:秒
4. 推荐的时间模块
DateTime(功能强大)
use DateTime;
# 创建当前时间对象
my $dt = DateTime->now(time_zone => 'local');
# 创建特定时间
my $dt2 = DateTime->new(
year => 2021,
month => 9,
day => 30,
hour => 14,
minute => 30,
second => 0,
time_zone => 'Asia/Shanghai',
);
# 时间计算
$dt->add(days => 7); # 加7天
$dt->subtract(hours => 3); # 减3小时
# 格式化输出
print $dt->strftime('%Y-%m-%d %H:%M:%S');
print $dt->ymd('-'); # 2021-09-30
print $dt->hms(':'); # 14:30:00
Time::Piece(Perl 5.10+ 内置)
use Time::Piece;
my $t = localtime; # Time::Piece 对象
print $t->strftime('%Y-%m-%d');
print $t->ymd; # 2021-09-30
print $t->hour; # 获取小时
# 时间计算
my $t2 = $t + 86400; # 加一天
my $diff = $t2 - $t; # 时间差(秒)
5. 实用示例
获取当前时间字符串
sub get_current_time {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
return sprintf("%04d-%02d-%02d %02d:%02d:%02d",
$year+1900, $mon+1, $mday, $hour, $min, $sec);
}
计算程序执行时间
use Time::HiRes qw(gettimeofday tv_interval);
my $t0 = [gettimeofday];
# 执行代码...
my $elapsed = tv_interval($t0); # 高精度时间差
printf "执行时间:%.6f 秒\n", $elapsed;
解析时间字符串
use Time::Piece;
my $t = Time::Piece->strptime('2021-09-30 14:30:00', '%Y-%m-%d %H:%M:%S');
选择建议:
- 简单需求:使用
localtime + strftime
- Perl 5.10+:推荐使用
Time::Piece(内置)
- 复杂时间操作:使用
DateTime 模块
- 高精度计时:使用
Time::HiRes
这些函数和模块可以满足大多数时间处理需求,建议根据具体场景选择合适的方法。