2013-11-04 5 views
4

DateTime::Locale에는 다양한 로케일과 국가에 대한 매우 다양한 날짜 및 시간 형식 목록이 있습니다. 고객이있는 국가에 따라 전자 메일에서 고객에게 사용하고 싶습니다.어떻게 DateTime :: Locale의 형식을 DateTime 객체와 함께 사용합니까?

설명서에서 중간 또는 긴 날짜 기능을 실제로 사용하는 방법을 이해하는 것은 약간 어렵습니다.

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::de_DE 해당 문서에서 이러한 date formats (발췌)를 보여줍니다. DateTime::Locale::Base에 따르면, 로케일 객체에는 다음 형식을 얻기위한 메소드가 있습니다 : $locale->date_format_long()$locale->date_format_medium().

는 일부 인터넷 검색 후 나는 그가이 코드 (발췌)를 보여줍니다 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 형식입니다. 시원한. 그러나 Sinan이 보여주는 것은 tedius로 보입니다. 즉, 그것은 다음과 같습니다 위해

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 개체를 stringify 수있는 방법이 있습니까?

답변

2

나는 당신의 반대 신안 Ünür의 방법이 무엇인지 확실하지 않다, 그래서 이것은 당신에게 호소하거나하지 않을 경우 나도 몰라,하지만 당신은 DateTime 객체의 문자열 화 (stringification)을 제어하는 ​​포맷터 객체를 지정할 수 있습니다

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

관련 문제