2017-08-02 150 views
0

的真實字符串化根據:日期時間

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」),則不起作用。

回答

3

您可以使用"$dt""".$o->dt。就像你的解決方案,它的簡稱

$dt->formatter ? $dt->formatter->format_datetime($dt) : $dt->iso8601 

如果你想有一個特定的格式,有$dt->strftime$dt->iso8601,或者你可以使用一個DateTime::Format::模塊。

+0

...無法通過包 「日期時間」 找到對象的方法 「字符串」 – yahermann

+0

是啊,我記錯了。 (未記錄的內部)方法實際上被命名爲'_stringify',但我不會使用它。已經修復。 – ikegami

+0

唉,我希望能在某個地方真正紮根,但我會接受這個答案。我還添加了一個stringify()作爲模塊維護者的建議:https://github.com/houseabsolute/DateTime.pm/issues/58 – yahermann

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 
+1

Re或*調用實際調用的方法('$ dt - > iso8601')*「,不,不完全。 '「$ dt」'相當於'$ dt-> formatter? $ dt-> formatter-> format_datetime($ dt):$ dt-> iso8601'。 – ikegami