Perl如何将localtime格式字符串转换为YYYYMMDD格式?
解决Perl中用POSIX::strftime转换localtime格式字符串到YYYYMMDD的问题
你遇到的问题核心是strftime不接受直接的日期字符串作为参数——它需要的是两种输入:要么是Unix时间戳(epoch秒数),要么是localtime()返回的9元素数值列表(秒、分、时、日、月、年、周几、一年中的第几天、夏令时标记)。直接传字符串肯定会报错,所以必须先把你的日期字符串解析成这些数值,再传给strftime。
下面是基于POSIX模块的完整解决方案,不需要额外安装其他模块:
use POSIX qw(strftime mktime); my $time = 'Fri Jan 8 14:24:27 2016'; # 第一步:解析日期字符串,提取关键部分 my ($mon_str, $day, $hour, $min, $sec, $year); if ($time =~ /^\w+ (\w{3}) (\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/) { ($mon_str, $day, $hour, $min, $sec, $year) = ($1, $2, $3, $4, $5, $6); } # 第二步:把月份字符串转换为0-11的数字(POSIX函数要求月份从0开始) my %month_map = ( Jan => 0, Feb => 1, Mar => 2, Apr => 3, May => 4, Jun => 5, Jul => 6, Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11 ); my $mon = $month_map{$mon_str}; # 第三步:年份转换为相对于1900的数值(POSIX函数要求年份是"年份-1900") my $year_epoch = $year - 1900; # 方法1:用mktime生成时间戳,再传给strftime my $timestamp = mktime($sec, $min, $hour, $day, $mon, $year_epoch); my $formatted_date = strftime("%Y%m%d", localtime($timestamp)); # 方法2:直接把数值列表传给strftime(更高效,不需要转时间戳) # my $formatted_date = strftime("%Y%m%d", $sec, $min, $hour, $day, $mon, $year_epoch); print $formatted_date; # 输出:20160108
关键细节说明:
- 正则表达式
/^\w+ (\w{3}) (\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/)用来匹配你的日期格式,提取出月份缩写、日期、时分秒和年份。 - 月份必须转换为0-11的数字(比如Jan对应0),这是POSIX时间函数的统一要求。
- 年份需要减去1900,因为
mktime和strftime接收的年份参数是“自1900年以来的年数”。
内容的提问来源于stack exchange,提问作者olivierg
相关产品推荐
相关产品推荐

