【问题标题】:True stringify of DateTimeDateTime 的真正字符串化
【发布时间】:2018-01-10 04:55:23
【问题描述】:

根据:

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 要求的真实字符串。

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

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

【问题讨论】:

    标签: json perl datetime cpan


    【解决方案1】:

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

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

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

    【讨论】:

    • ...无法通过包“DateTime”定位对象方法“stringify”
    • 是的,我记错了。 (undocumented, internal) 方法实际上被命名为_stringify,但我不会使用它。已经修好了。
    • 唉,我希望在某个地方有一个真正的字符串化,但我会接受这个答案。我还添加了一个 stringify() 作为对模块维护者的建议:github.com/houseabsolute/DateTime.pm/issues/58
    • 你在说什么?如何获得比stringify 操作码更真实的字符串化? perl -MO=Concise,-exec -e'"$dt"'
    • "".$person->birth_d
    【解决方案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
    

    【讨论】:

    • Re "或者调用实际被调用的方法 ($dt->iso8601)",不,不完全是。 "$dt" 等价于 $dt->formatter ? $dt->formatter->format_datetime($dt) : $dt->iso8601
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多