DateTime 的真正字符串化

True stringify of DateTime

根据:

http://search.cpan.org/~drolsky/DateTime-1.43/lib/DateTime.pm#Formatters_And_Stringification

以下将起作用:

use DateTime;
$dt = DateTime->new( ... );
print $dt;  # as string

确实如此。

但是,当使用 JSON 模块将创建的 $dt 字符串嵌入为 json 编码的数据结构时,如下所示:

use JSON;
my $json = JSON::encode_json( { dt => $dt } );

JSON 模块抛出以下异常:

encountered object '2017-08-02', but neither allow_blessed nor convert_blessed settings are enabled at ...

我可以按如下方式解决此问题:

my $json = JSON::encode_json( { dt => substr($dt,0) } );

但想知道是否有更简洁的方法从 DateTime 中获取 "true" 字符串?

我查看了 DateTime 文档,但没有看到明确的 stringify() 来创建 JSON 所要求的真实字符串。

编辑:在构造函数中,我通过 'formatter' 指定了所需的输出格式。我想使用已经指定的格式获取一个字符串,而不是再次指定格式(这将违反 DRY 原则...)

EDIT2:如果只是 $dt,则内插字符串是一个很好的解决方案,但如果 $dt 实际上是一个驼鹿属性(即“$person->birth_d”)则不起作用。

您可以使用 "$dt""".$o->dt。就像您的解决方案一样,它是

的缩写
$dt->formatter ? $dt->formatter->format_datetime($dt) : $dt->iso8601

如果您想要特定格式,可以使用 $dt->strftime$dt->iso8601,或者您可以使用 DateTime::Format:: 模块。

您可以在字符串中显式插入对象 ("$dt") 或调用实际调用的方法 ($dt->iso8601)。

use strict;
use warnings;
use 5.010;

use DateTime;

my $dt = DateTime->now;

say $dt;
say "$dt";
say $dt->iso8601;

输出:

2017-08-02T19:54:22
2017-08-02T19:54:22
2017-08-02T19:54:22