如何将DateTime :: Locale中的格式与DateTime对象一起使用?

sim*_*que 5 perl datetime locale

DateTime :: Locale具有非常全面的各种区域设置和国家/地区的日期和时间格式列表.我想在给客户的电子邮件中使用它,具体取决于客户所在的国家/地区.

遗憾的是,从文档中了解如何将这些函数实际用于中期​​或长期日期有点难以理解.例如,DateTime :: Locale :: de_DE在doc中列出了这些日期格式(摘录):

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
Run Code Online (Sandbox Code Playgroud)

这很棒.根据DateTime :: Locale :: Base,locale对象中有一些方法可以获取这些格式:$locale->date_format_long()$locale->date_format_medium().

经过一些谷歌搜索后,我想出了SinanÜnür的博客,在那里他展示了这段代码(摘录):

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)
    );
}
Run Code Online (Sandbox Code Playgroud)

因此,这些方法产生的格式是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);
}
Run Code Online (Sandbox Code Playgroud)

为了缩短它,我当然可以这样做:

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;
Run Code Online (Sandbox Code Playgroud)

但我不想这样做.所以我的问题:有没有办法根据其语言环境中的一种格式使用我缺少的内置方法对DateTime对象进行字符串化?

Thi*_*Not 4

我不确定你对 Sinan \xc3\x9cn\xc3\xbcr 的方法有何反对意见,所以我不知道这是否会吸引你,但你可以指定一个格式化程序对象来控制对象的字符串化DateTime

\n\n
use DateTime;\nuse DateTime::Format::CLDR;\nuse DateTime::Locale;\n\nmy $locale = DateTime::Locale->load('de_DE');\nmy $formatter = DateTime::Format::CLDR->new(\n    pattern => $locale->date_format_long,\n    locale => $locale\n);\nmy $dt = DateTime->now( locale => $locale, formatter => $formatter );\nprint $dt;\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
use DateTime;\nuse DateTime::Format::CLDR;\nuse DateTime::Locale;\n\nmy $locale = DateTime::Locale->load('de_DE');\nmy $dt = DateTime->now( locale => $locale );\nmy $formatter = DateTime::Format::CLDR->new(\n    pattern => $locale->date_format_long,\n    locale => $locale\n);\n$dt->set_formatter($formatter);\nprint $dt;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这种方法的好处是,一旦设置了格式化程序,打印日期就很容易了。

\n