5

DateTime::Localeには、さまざまなロケールと国の日付と時刻の形式の非常に包括的なリストがあります。お客様の国によっては、お客様へのメールで使用したいと考えています。

残念ながら、中程度または長い日付の関数を実際に使用する方法をドキュメントから理解するのは少し難しいです. たとえば、DateTime::Locale::de_DEは、これらの日付形式(抜粋) をドキュメントに示しています。

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

これは素晴らしい。DateTime::Locale::Baseによると、ロケール オブジェクトにはこれらの形式を取得するメソッドがあります:$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)
    );
}

したがって、これらのメソッドから得られる形式は 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 オブジェクトを文字列化する方法はありますか?

4

1 に答える 1