Perl将本地时间格式的时间转换为YYYYMMDD



我有一个字符串,其中包含一个格式的日期

my $time = 'Fri Jan  8 14:24:27 2016';

我想把它转换成YYYYMMDD。我尝试了几个选项,例如:

use POSIX qw(strftime);
print strftime("%Y%m%d", $time);

但这行不通。尝试过localtime($time)以及其他许多方法,但都不起作用。

我想我需要将其转换为中间格式吗?

注意:我需要使用strftime/POSIX,因为有很多原因我不能调用其他模块。(无日期::时间等(

提前感谢

使用时间::Piece,自2007年以来一直是Perl核心的一部分:

use Time::Piece;
my $time = 'Fri Jan  8 14:24:27 2016';
say Time::Piece->strptime($time, '%a %b %d %H:%M:%S %Y')->ymd("");

您试图错误地使用POSIX::strftime()。检查文档总是一个好主意,上面写着:

strftime

将日期和时间信息转换为字符串。返回字符串。

简介:

strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)

月份(mon(、工作日(wday(和年份(yday(从零开始,即1月是0,而不是1;星期日是0,而不是1;1月1日是0,而不是1。年份(年(以1900年以来的年份为单位,即1995年为95年;2001年是101年。有关这些参数和其他参数的详细信息,请参阅系统的strftime()手册页。

因此,向它传递一个包含日期时间的随机(ish(表示的字符串有点乐观。

您需要解析字符串并提取需要传递给strftime()的位。正如您已经展示的那样,实现这一点的现代Perl方法是使用Time::Piece这样的模块。但是,使用标准Perl也完全有可能做到这一点。

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use POSIX 'strftime';
my $time = 'Fri Jan  8 14:24:27 2016';
my ($day, $mon, $date, $hr, $min, $sec, $year) = split /[s:]+/, $time;
my %months = (
Jan => 0, Feb => 1, Mar => 2, Apr => 3,
May => 4, Jun => 5, Jul => 6, Aug => 7,
Sep => 8, Oct => 9, Nov => 10, Dec => 11,
);
$time = strftime('%Y%m%d',
$sec, $min, $hr, $date, $months{$mon}, $year - 1900);
say $time;

但不要那样做。使用模块。

最新更新