Истинная строка 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
Другие вопросы по тегам