使用Date :: Parse模块的Perl无法以其他格式打印<stdin>日期

时间:2019-01-02 11:22:52

标签: perl

我想在命令行上以

格式接受用户日期

dd / mm / yyyy

然后将日期打印给用户

yyyy / mm / dd

我正在尝试使用Date :: Parse模块将其解析为要重印的日期。

Date:Parse docs表明我应该能够从用户输入中获得$ day,$ month和$ year。

use Date::Parse;

$time = str2time($date);

($ss,$mm,$hh,$day,$month,$year,$zone) = strptime($date);

这是我当前的代码:

use strict;
use Date::Parse;

print "Enter a date in dd/mm/yyy format: ";
my $user_date = <STDIN>;
my @date      = strptime($user_date);

# ( $day, $month, $year ) = strptime($user_date);
# my $user_day = ( ($day) = strptime($user_date) );
print "%Y/%m/%d", @date;

但是打印失败,并且从输出中出现,在10中输入10表示输出中是9。

输出

Enter a date in dd/mm/yyy format: 16/10/1952
%Y/%m/%d1952916s

我该怎么办?

1 个答案:

答案 0 :(得分:6)

Date :: Parse的文档尚不清楚,但看起来您以localtime()的格式返回了值。例如,年份似乎是年份减去1900。这意味着月份数将是0到11,而不是1到12。

Date :: Parse已经五年没有更新了。我建议最近最好避免这种情况。有很多更好的选择。其中包括Time::Piece,自5.10.0版本以来,它已作为Perl发行版的标准部分包含在内。您可以使用其strptime()(字符串解析时间)方法来解析您的字符串,并可以使用其strftime()(字符串格式时间)来根据需要格式化日期对象。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Time::Piece;

print "Enter a date in dd/mm/yyy format: ";
chomp(my $user_date = <STDIN>);

my $tp = Time::Piece->strptime($user_date, '%d/%m/%Y');

say $tp->strftime('%Y/%m/%d');

更新

此外,还不清楚这行应该做什么:

print "%Y/%m/%d", @date;

我认为您正在考虑使用POSIX.pm中的strftime()方法。

print strftime "%Y/%m/%d", @date;

但是由于use warnings中所有未定义的值,@data会生成警告(这是该模块中一个非常奇怪的设计决策,我认为是避免它的另一个原因)。您可以通过以下方式解决此问题:

my @date      = strptime($user_date);

使用:

my @date      = map { $_ // 0 } strptime($user_date);