我想在命令行上以
格式接受用户日期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
我该怎么办?
答案 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);