Истинная строка 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?
Я просмотрел документы DateTime, но не вижу явного stringify() для создания истинной строки, как того требует JSON.
РЕДАКТИРОВАТЬ: В конструкторе я определяю желаемый формат вывода с помощью "форматера". Я хотел бы получить строку, используя уже указанный формат, и не указывать формат снова (что противоречит принципу СУХОЙ...)
РЕДАКТИРОВАТЬ 2: Интерполяция строки является хорошим решением, если только $dt, но не работает, если $dt на самом деле является атрибутом Moose (то есть "$person->birth_d").
2 ответа
Ты можешь использовать "$dt"
или же "".$o->dt
, Как и ваше решение, оно коротко для
$dt->formatter ? $dt->formatter->format_datetime($dt) : $dt->iso8601
Если вы хотите определенный формат, есть $dt->strftime
, $dt->iso8601
Или вы можете использовать DateTime:: Format:: module.
Вы можете явно интерполировать объект в строке ("$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