【问题标题】:Convert this time format "2019-02-28T08:42:57+0000" to YYYY-MM-DD format in perl在perl中将此时间格式“2019-02-28T08:42:57+0000”转换为YYYY-MM-DD格式
【发布时间】:2019-02-28 10:03:30
【问题描述】:

我想转换以下时间格式- perl 中的 "2019-02-28T08:42:57+0000" 为 YYYY-MM-DD 格式

【问题讨论】:

  • 好的,继续。你有没有考虑过这个?试过什么?请查看How to Ask 并通过tour 了解如何使用 Stack Overflow。我们不会为你做你的工作。

标签: perl date time


【解决方案1】:

这里不需要日期模块。您想要的格式包含在您拥有的格式中。 substr 是您所要做的。 ISO 8601 日期的长度始终为 10 个字符,并且您从前面开始。

print substr $date, 0, 10;

【讨论】:

    【解决方案2】:

    Date::Manip:

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    use Date::Manip:.Date;
    
    my $date = new Date::Manip::Date;
    $date->parse("2019-02-28T08:42:57+0000")
        and die "parse" . $date->err() . "\n";
    
    print $date->printf("%Y-%m-%d\n");
    
    exit 0;
    

    试运行:

    $ perl dummy.pl
    2019-02-28
    

    注意: 日期和时间解析是一个复杂的主题。所以请

    • 选择合适的模块而不是编写自己的解析器
    • 研究你为任务选择的模块的文档

    【讨论】:

    • 我记得 Date::Manip 很重。还是这样吗?
    • @simabque 不知道。但我对此并不担心,因为它已经在我的 XMLTV 屏幕抓取工具中完美运行了 10 多年......
    • 我明白了。是的,我不是说这很糟糕。我过去也用过。出于某种原因,现在更喜欢 DateTime。
    • @simbabque 这个DM5 -> DM6 change document 可能会回答你的问题。我猜你不应该再使用Date::Manip,而是更小的Date::Manip::Date。更新了我的答案。
    • DateTime 对于解析器、格式化程序和其他模块的庞大生态系统来说更好(在我看来),它们都使用相同的底层数据模型。对于更简单的东西(比如这个问题) Time::Piece 是我的首选解决方案,因为它包含在核心 Perl 中。
    【解决方案3】:

    在这种情况下,最简单的解决方案(正如 simbabque 已经指出的那样)是将日期视为字符串。除了给您提供的substr() 解决方案外,您还可以使用正则表达式删除“T”及其后面的所有内容。

    $date =~ s/T.*$//;
    

    如果您真的想解析和重新格式化日期,那么 Time::Piece 自 2007 年以来已包含在标准 Perl 发行版中。

    use Time::Piece;
    
    $date = '2019-02-28T08:42:57+0000';
    my $tp = Time::Piece->strptime($date, '%Y-%m-%dT%H:%M:%S%z');
    say $tp->strftime('%Y-%m-%d');
    

    对于更复杂的日期和时间处理(此处不需要,但为了完整起见,我将其包括在内)您应该阅读DateTime 及其朋友。

    use DateTime;
    use DateTime::Format::Strptime;
    
    my $parser = DateTime::Format::Strptime->new(
      pattern => '%Y-%m-%dT%H:%M:%S%z',
    );
    
    my $date = '2019-02-28T08:42:57+0000';
    
    my $dt = $parser->parse_datetime($date);
    
    say $dt->strftime('%Y/%m/%d');
    

    【讨论】:

      【解决方案4】:

      请试试这个:

      use Date::Parse qw(str2time);
      use Date::Format qw(time2str);
      
      my $string = '2019-02-28T08:42:57+0000';
      
      my $time = str2time($string);
      my $date = time2str("%Y-%m-%d %H:%M:%S", $time);
      
      print $date;
      

      【讨论】:

      • 非常感谢普拉卡什。这很有帮助
      • 嗨普拉卡什。欢迎来到堆栈溢出。谢谢您的回答。但请确保所有答案都包含解释。在 StackOverflow,我们正在努力提供最高质量和最有用的答案。 Tips Here 最好的问候。
      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2013-08-31
      相关资源
      最近更新 更多