【问题标题】:Getting error when using Date::Format使用 Date::Format 时出错
【发布时间】:2011-05-27 11:07:25
【问题描述】:

我想将2003-07-04T15:56:00 转换为04/07-2003 所以我愿意

#!/usr/bin/perl -w
use strict;
use Date::Format;
use Data::Dumper;

my $time_format = "%d/%m-%Y";
my $time = "2003-07-04T15:56:00";

print Dumper time2str($time_format, $time);

得到

Argument "2003-07-04T15:56:00" isn't numeric in localtime at /usr/lib/perl5/vendor_perl/5.8.8/Date/Format.pm line 123.
$VAR1 = '01/01-1970';

知道如何进行此日期转换吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    错误消息出现在:time2str 需要数字日期表示,但得到了字符串 "2003-07-04T15:56:00"

    很可能有几种方法可以解决此问题。其中之一是Time::Local,它可以帮助您创建正确的数字日期。

    尝试替换

    my $time = "2003-07-04T15:56:00";
    

    与:

    my $time = timelocal(0,56,15,4,7-1,2003);
    

    正如@Jorik 指出的,月份规范有点不寻常:

    值得特别画 注意预期范围 提供的值。的价值 月中的一天是实际的一天(即 1..31),而月份是自一月以来的月数 (0..11)。这个 与返回的值一致 来自 localtime() 和 gmtime()。

    编辑 有关字符串中日期的通用解决方案,请查看以下问题的答案:How can I parse dates and convert time zones in Perl?

    【讨论】:

    • 小而重要的评论(1 个月;)。原始字符串可能指的是 7 月 4 日,而 timelocal 的参数指的是 8 月 4 日 (0..11)!
    • 问题是,以2003-07-04T15:56:00 格式获取日期,所以我应该只使用正则表达式将其转换为dd/mm-yyyy 还是有办法为我解决这个问题?
    • Sandra:也有几种解决方案,我已经更新了答案,并提供了一个关于此问题的较早问题的链接。
    【解决方案2】:
    DateTime::Format::Strptime
        ->new(pattern => '%FT%T')
        ->parse_datetime('2003-07-04T15:56:00')
        ->strftime('%d/%m-%Y')
    
    # returns 04/07-2003
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 2019-05-06
      • 2022-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多