Perl 将本地时间格式的时间转换为 YYYYMMDD
Perl convert time in localtime format to 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,因为出于多种原因我无法调用其他模块。 (没有 Date::Time 等)
提前致谢,
使用 Time::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()
。检查 the documentation 总是一个好主意,它表示:
strftime
Convert date and time information to string. Returns the string.
Synopsis:
strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
The month (mon
), weekday (wday
), and yearday (yday
) begin at zero, i.e., January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1. The year (year ) is given in years since 1900, i.e., the year 1995 is 95; the year 2001 is 101. Consult your system's strftime()
manpage for details about these and the other arguments.
因此向它传递一个包含日期时间的随机(大概)表示形式的字符串有点乐观。
您需要解析字符串并提取需要传递给 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;
但是不要那样做。使用模块。
我有一个包含这种格式的日期的字符串
my $time = 'Fri Jan 8 14:24:27 2016';
我想将其转换为 YYYYMMDD。 我尝试了几个选项,例如:
use POSIX qw(strftime);
print strftime("%Y%m%d", $time);
但是不行。
尝试了 localtime($time)
以及许多其他方法,但它不起作用。
我想我需要将其转换为中间格式?
注意:我需要使用 strftime/POSIX,因为出于多种原因我无法调用其他模块。 (没有 Date::Time 等)
提前致谢,
使用 Time::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()
。检查 the documentation 总是一个好主意,它表示:
strftime
Convert date and time information to string. Returns the string.
Synopsis:
strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
The month (
mon
), weekday (wday
), and yearday (yday
) begin at zero, i.e., January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1. The year (year ) is given in years since 1900, i.e., the year 1995 is 95; the year 2001 is 101. Consult your system'sstrftime()
manpage for details about these and the other arguments.
因此向它传递一个包含日期时间的随机(大概)表示形式的字符串有点乐观。
您需要解析字符串并提取需要传递给 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;
但是不要那样做。使用模块。