发布于2026-06-29 阅读(0)
扫一扫,手机访问
在Perl中处理时间信息,其实绕不开两种最基本的表示方式:一种是人类一眼就能看懂的本地时间字符串,比如“Sat Mar 14 10:14:05 EDT 2015”;另一种则是计算机更喜欢的UNIX时间戳——从1970年1月1日零点开始算起的秒数。两种各有优劣,但实际开发中经常需要在它们之间来回切换。下面就来聊聊具体的转换方法,顺便带几个常见的坑。

如果你手头有一个日期字符串,想拿到对应的UNIX时间戳,最省事的做法是用Date::Parse模块里的str2time()函数。这个函数相当聪明,能自动识别多种常见的时间格式,比如下面这些:
Sat Mar 14 10:14:05 EDT 2015 3/14/2015 10:14:05 -0400 14/Mar/15 10:14:05 14 Mar 15 10:14:05 use Date::Parse; my $local_time = "Sat Mar 14 10:14:05 EDT 2015"; # 1426342445 will be stored in $unix_time my $unix_time = str2time($local_time);
更贴心的是,Date::Parse还支持多种语言(英语、法语、德语、意大利语等)和不同时区。如果你需要解析法语时间字符串,可以搭配Date::Language模块一起用:
use Date::Parse;
use Date::Language;
my $lang = Date::Language->new('French');
my $unix_time = $lang->str2time("12:14:05, Ago 16, 2014 (CEST)");
反过来,想把UNIX时间戳变乘人能看懂的格式,核心工具是Perl内置的localtime()函数。它会把时间戳拆成一个9元素的列表,然后你想组装成什么格式就组装成什么格式。下面这段代码演示了最常见的用法:
# $sec, $min, $hour: 秒,分,时 # $mday: 月中的某天 (0-31) # $mon: 月份,范围 0 (一月) 至 11 (十二月) # $year: 年份,与1900年的差值(2015年为2015-1900=115) # $wday: 星期,范围 0 (星期天) 至 6 (星期六) # $yday: 年中的某天,范围 0 至 364 (或 365 闰年) # $isdst: 是否是夏令时 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp); # necessary conversion of $mon and $year $mon += 1; $year += 1900; print "Current time: $year-$mon-$mday $hour:$min:$secn";
需要注意的是,localtime()返回的月份和年份需要手动修正:月份从0开始,所以加1;年份是相对于1900的偏移,所以加1900。这个小细节经常被新手忽略,调试时很容易踩坑。
上一篇:Perl中的真与假深入研究
下一篇:Perl数组排序学习笔记
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8