2013-11-04 70 views
4

DateTime::Locale包含各種語言環境和國家的日期和時間格式的非常全面的列表。我想用電子郵件給客戶,這取決於客戶來自哪個國家。如何在DateTime :: Locale中使用DateTime對象的格式?

不幸的是,從文檔中瞭解如何實際使用中型或長型日期的函數有點困難。例如,DateTime::Locale::de_DE列出了這些文檔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 

這是偉大的。根據DateTime::Locale::Base,語言環境對象中有方法獲取這些格式:$locale->date_format_long()$locale->date_format_medium()

一些google搜索後,我來到了Sinan Ünür's blog,在那裏他顯示了這個代碼(節選):

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對象進行串聯化?

回答

2

我不知道你的對手是思南Ü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; 

這種方法的好處是,一旦你設置了格式,打印日期是易於peasy。

+0

格式化程序似乎是一個不錯的選擇。感謝您的證明。如果我做很多事情,我主要是在尋找一個不太重複的選項。 – simbabque