datetime strptime返回错误的模式

时间:2019-01-21 21:58:49

标签: perl

我从文件中提取日期,并通过使用此命令创建一个datetime对象,然后向其添加1以获取下一个日期。

my $parseit = DateTime::Format::Strptime->new(pattern => '%Y%m%d');
my $lastdate = "20190115";
my $tempdate = $parseit->parse_datetime($lastdate);
my $date_up1 = $tempdate->add(days => 1);

但是在打印变量$ date_up1时,我总是以%Y-%m-%d的形式获取它。我如何才能将其返回到我选择的模式中。

2 个答案:

答案 0 :(得分:2)

默认情况下,

strptime以及DateTime :: Format :: Strptime仅指示如何将输入解析为DateTime对象。 DateTime对象默认为您看到的特定字符串。为了以某种方式对其进行字符串化,可以使用其strftime方法。

print $date_up1->strftime('%Y%m%d');

答案 1 :(得分:1)

虽然DateTime :: Format :: Strptime可用于解析和格式化日期时间,但它并没有将自己设置为它按预期创建的DateTime对象的默认格式化程序。您可以通过添加以下内容来明确地做到这一点:

$tempdate->set_formatter($parseit);

清理代码后,如下所示:

my $date = "20190115";

my $format = DateTime::Format::Strptime->new(
   pattern  => '%Y%m%d',
   on_error => 'croak',
);

my $dt = $format->parse_datetime($date);
$dt->set_formatter($format);
$dt->add( days => 1 );
say $dt;

或者,以下所有工作都无需设置格式化程序:

  • $format->format_datetime($dt)
  • $dt->strftime("%Y%m%d")(最灵活,但在这种情况下会引入重复的代码)
  • $dt->ymd("")(在这种情况下最简单)