perldatetimeencodingcldr

DateTime::Format::CLDR issues parsing long Czech dates


I am trying to parse Czech dates using CLDR long format as specified by DateTime::Locale::cs_CZ. I see no obvious reason why it should fail.

my $locale2 = DateTime::Locale->load('cs_CZ');
my $cldr5 = DateTime::Format::CLDR->new(
    pattern     => $locale2->date_format_long,
    locale      => $locale2,
    );

print $cldr5->pattern, "\n";
print $cldr5->parse_datetime('17. listopad 1989');

The output is

d. MMMM y

Use of uninitialized value in print at ./test-cldr.pl line 54.

What am I doing wrong? Why does it not parse the date?

UPDATE

This is what I have actually been using to test this on command line:

perl -MData::Dumper -MDateTime -MDateTime::Format::CLDR -wle'
    local $SIG{__DIE__} = sub { print( Carp::longmess (shift) ); };
    $x="19. září 1979";
    my $loc = DateTime::Locale->load("cs_CZ");
    print Dumper($loc), "\n";
    my $cldr = DateTime::Format::CLDR->new(
       pattern=>$loc->date_format_long, locale=>$loc, on_error => "croak");
    print Dumper($cldr->parse_datetime($x));
'

This is the output I get:

$VAR1 = bless( {
                 'en_language' => 'Czech',
                 'native_territory' => "\x{10c}esk\x{e1} republika",
                 'en_territory' => 'Czech Republic',
                 'native_language' => "\x{10d}e\x{161}tina",
                 'default_time_format_length' => 'medium',
                 'id' => 'cs_CZ',
                 'native_complete_name' => "\x{10d}e\x{161}tina \x{10c}esk\x{e1} republika",
                 'default_date_format_length' => 'medium',
                 'en_complete_name' => 'Czech Czech Republic'
               }, 'DateTime::Locale::cs_CZ' );


Could not get datetime for 19. září 1979 (Error marked by 'HERE-->'): '19.  HERE-->září 1979' at -e line 7.
 at /usr/share/perl5/DateTime/Format/CLDR.pm line 965.
    DateTime::Format::CLDR::_local_croak(DateTime::Format::CLDR=HASH(0x166bcd8), "Could not get datetime for 19. z\x{c3}\x{a1}\x{c5}\x{99}\x{c3}\x{ad} 1979 (Error marked by "...) called at /usr/share/perl5/DateTime/Format/CLDR.pm line 558
    DateTime::Format::CLDR::__ANON__("z\x{c3}\x{a1}\x{c5}\x{99}\x{c3}\x{ad} 1979") called at /usr/share/perl5/DateTime/Format/CLDR.pm line 582
    DateTime::Format::CLDR::parse_datetime(DateTime::Format::CLDR=HASH(0x166bcd8), "19. z\x{c3}\x{a1}\x{c5}\x{99}\x{c3}\x{ad} 1979") called at -e line 7

Could not get datetime for 19. září 1979 (Error marked by 'HERE-->'): '19.  HERE-->září 1979' at -e line 7.

Solution

  • 17. listopad 1989

    print(Dumper($self->_build_pattern())); gives a peek into what the module expects. It outputs the following in this case.

    $VAR1 = [
              [
                qr/(3[01]|[12]\d|0?[1-9])/,
                'd',
                1
              ],
              '\\.',
              '\\s+',
              [
                "(listopadu|\x{10d}ervence|prosince|b\x{159}ezna|kv\x{11b}tna|\x{10d}ervna|ledna|\x{fa}nora|dubna|srpna|\x{159}\x{ed}jna|z\x{e1}\x{159}\x{ed})",
                'M',
                4
              ],
              '\\s+',
              [
                qr/(-?\d{1,4})/,
                'y',
                1
              ]
            ];
    

    It expects listopadu, but not listopad. I don't know anything about Czech, but the module's behaviour appears to be correct. You could "fix up" the dates before parsing them.

    $date_string =~ s/\blistopad\b\K/u/;
    

    19. září 1979

    You're not actually passing září ("z\x{e1}\x{159}\x{ed}"). You're passing its UTF-8 encoding ("z\x{c3}\x{a1}\x{c5}\x{99}\x{c3}\x{ad}"). Add use utf8; to tell Perl the source code is encoded using UTF-8.