代码之家  ›  专栏  ›  技术社区  ›  sayth

Perl使用日期::Parse模块无法以不同格式打印<stdin>date

  •  1
  • sayth  · 技术社区  · 6 年前

    我想在命令行中接受格式为的用户日期

    DD/MM/YYYY

    然后打印日期给用户输入

    YYYY/MM/DD

    我正在尝试使用日期::解析模块解析为要重新打印的日期。

    这个 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 回复  |  直到 6 年前
        1
  •  6
  •   Dave Cross    6 年前

    日期::parse的文档不清楚,但看起来您将值恢复为 localtime() 希望如此。例如,年份似乎是负1900的年份。这意味着月份号将是0到11,而不是1到12。

    日期::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;
    

    我想你想用 STF() posix.pm中的方法。

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

    但与 use warnings 这将生成警告,因为中的所有未定义值 @data (在那个模块中,这是一个相当奇怪的设计决策,在我看来,这是另一个避免它的原因)。您可以通过替换:

    my @date      = strptime($user_date);
    

    用:

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