如何强制 Time::Piece strftime 使用特定的语言环境

3

如何强制Time::Piece->strftime按照特定的语言环境输出星期和月份名称,而不是按照当前语言环境输出?

$ENV{LC_ALL}设置为特定的语言环境(例如C.UTF-8)似乎并不起作用。

以下测试脚本:

#!/usr/bin/env perl

$ENV{LC_ALL} = "C.UTF-8";

use strict;
use warnings;
use Time::Piece;

my $s1 = "Mon, 26 Sep 2022";
my $format = "%a, %d %b %Y";
my $d = Time::Piece->strptime($s1, $format);
my $s2 = $d->strftime($format);

if ($s1 eq $s2) {
        print("OK: '$s1' == '$s2'\n");
} else {
        die("ERROR: '$s1' != '$s2'\n");
}

例如在 fr_CH.UTF-8 环境下运行时会失败:

$ LC_ALL=fr_CH.UTF-8 ./test-strftime.pl
ERROR: 'Mon, 26 Sep 2022' != 'lun, 26 sep 2022'
1个回答

4
Perl 依赖于 glibc 来扩展这些格式,且仅在启动时初始化区域设置定义。您可以使用 POSIX::setlocale() 强制在运行时将其重新初始化为所选的区域设置,但注意,这是一个真正的全局操作,并且在 Perl 5.28 以前可能会影响其他线程。
示例(而不是 $ENV{LC_ALL} = "C.UTF-8"):
use POSIX qw(locale_h);
setlocale(LC_ALL, "C.UTF-8");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接