in reply to Localized weekday names

Hi,

Not sure why you don't want to use library modules. I do, so I am not an expert on POSIX native functions or their Perl implementation. But I do see in the doc for POSIX::strftime:

... the results of some of the conversion specifiers are non-portable. For example, the specifiers aAbBcpZ change according to the locale settings of the user, and both how to set locales (the locale names) and what output to expect are non-standard.

Easy with DateTime (and you don't need to muck around with changing the system locale):

$ perl -MDateTime -E 'say DateTime->from_epoch(epoch => time + $_ * 86 +400, locale => "fr")->day_name for (0..6)' jeudi vendredi samedi dimanche lundi mardi mercredi

Hope this helps!


The way forward always starts with a minimal test.

Replies are listed 'Best First'.
Re^2: Localized weekday names
by Sec (Monk) on Nov 03, 2017 at 15:27 UTC
    Well, I wanted the list to a) start with Sunday, and b) have the "short" day name.

    So I modified your code to something like this:

    perl -MDateTime -le '@wd=map {DateTime->new(locale=> "de", year=>1970, +month=>1,day=>4+$_)->strftime("%a")} (0..6);print join",",@wd'
    Which does work, but for Germany this interestingly produces
    So.,Mo.,Di.,Mi.,Do.,Fr.,Sa.
    instead of the desired
    So,Mo,Di,Mi,Do,Fr,Sa
    It doesn't look like DateTime can handle %a returning only 2 chars. -- No Idea why :-)

      Hi,

      It doesn't look like DateTime can handle %a returning only 2 chars. -- No Idea why :-)

      That's not it at all. Please see the documentation for DateTime::Locale. You can look up the data used by DateTime::Locale for each locale code, for example, for the one you used, de, at https://metacpan.org/pod/distribution/DateTime-Locale/lib/DateTime/Locale/de.pod, which contains:

      Abbreviated (format) Mo. Di. Mi. Do. Fr. Sa. So. ... Abbreviated (stand-alone) Mo Di Mi Do Fr Sa So
      So you should use DateTime::format_cldr() with format ccc to print "Abbreviated (stand-alone)", as shown in the docs:
      $ perl -Mstrict -MDateTime -wlE 'say join", ", map { DateTime->new( lo +cale => "de", year => 1970, month => 1, day => 4 + $_ )->format_cldr( +"ccc") } 0 .. 6' So, Mo, Di, Mi, Do, Fr, Sa


      The way forward always starts with a minimal test.