DateTime

时间:2017-08-02 19:48:25

标签: json perl datetime cpan

根据:

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中获取“真正的”字符串?

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您可以在字符串("$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