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
根据:
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