DateTime::Locale有一个非常全面的各种语言区域和国家/地区的日期和时间格式列表。我想在给客户的电子邮件中使用它,具体取决于客户所在的国家/地区。
不幸的是,从文档中了解如何将这些函数实际用于中期或长期日期有点难以理解。例如,DateTime::Locale::de_DE在doc:
中列出了这些date formats(摘录)Long 2008-02-05T18:30:30 = 5. Februar 2008 1995-12-22T09:05:02 = 22. Dezember 1995 -0010-09-15T04:44:23 = 15. September -10 Medium 2008-02-05T18:30:30 = 05.02.2008 1995-12-22T09:05:02 = 22.12.1995 -0010-09-15T04:44:23 = 15.09.-010
这很棒。根据{{3}},区域设置对象中有一些方法可以获取这些格式:$locale->date_format_long()
和$locale->date_format_medium()
。
经过一些谷歌搜索后,我想出了DateTime::Locale::Base,在那里他展示了这段代码(摘录):
for my $locale ( qw(ar da de en_GB es fr ru tr) ) { $dt->set_locale( $locale ); print_date( $dt ); } sub print_date { my ($dt) = @_; my $locale = $dt->locale; printf( "In %s: %s\n", $locale->name, $dt->format_cldr($locale->date_format_full) ); }
因此,这些方法的格式是cldr格式。凉。但是,思南所表现出来的东西看起来很像。简而言之,它将是:
for (qw( ar da de en_GB es fr ru tr )) {
my $dt2 = DateTime->now( locale => $_ );
printf "%s: %s\n", $_, $dt2->format_cldr($dt2->locale->date_format_long);
}
为了缩短它,我当然可以这样做:
package DateTime;
sub stringify_long {
return $_[0]->format_cldr($_[0]->locale->date_format_long);
}
package Main;
use strict; use warnings;
use DateTime;
my $dt = DateTime->now( locale => 'de_DE' );
print $dt->stringify_long;
但我不想这样做。所以我的问题:有没有办法根据其语言环境中的一种格式使用我缺少的内置方法对DateTime对象进行字符串化?
答案 0 :(得分:4)
我不确定你对SinanÜnür的方法有什么反对意见,所以我不知道这是否会吸引你,但你可以指定一个格式化程序对象来控制DateTime
对象的字符串化:
use DateTime;
use DateTime::Format::CLDR;
use DateTime::Locale;
my $locale = DateTime::Locale->load('de_DE');
my $formatter = DateTime::Format::CLDR->new(
pattern => $locale->date_format_long,
locale => $locale
);
my $dt = DateTime->now( locale => $locale, formatter => $formatter );
print $dt;
或
use DateTime;
use DateTime::Format::CLDR;
use DateTime::Locale;
my $locale = DateTime::Locale->load('de_DE');
my $dt = DateTime->now( locale => $locale );
my $formatter = DateTime::Format::CLDR->new(
pattern => $locale->date_format_long,
locale => $locale
);
$dt->set_formatter($formatter);
print $dt;
这种方法的好处在于,一旦你设置了格式化程序,打印日期就很容易了。