You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl生成德语月份缩写及昨日日期格式异常问题求助

解决Perl中生成德语昨日日期缩写的问题

你的问题出在DateTime生成的是英文月份缩写,再传给Date::Language时无法正确转换,而且你的用法既绕了弯路,也没充分利用工具的本地化能力。下面给你两种可行的解决方案:

方案一:直接用DateTime的locale生成德语格式(推荐)

DateTime本身支持本地化设置,完全不需要额外引入Date::Parse和Date::Language。只需要给DateTime对象设置德语locale,strftime就能直接输出德语的月份缩写:

use DateTime qw( );

my $yday_date = DateTime->now( time_zone => 'local' )
                        ->set_time_zone('floating')
                        ->truncate( to => 'day' )
                        ->subtract( days => 1 )
                        ->set_locale('de_DE')  # 启用德语本地化规则
                        ->strftime('%b%d');

print $yday_date;  # 会输出 Dez08

为什么这能行?

set_locale('de_DE')告诉DateTime使用德语的区域设置,这时strftime('%b')就会输出德语的月份缩写(12月对应Dez而不是英文的Dec),一步到位生成你需要的格式。

方案二:正确使用Date::Language(如果坚持用该模块)

如果你一定要保留Date::Language,问题在于你传给time2str的是已经格式化好的英文日期字符串,但它需要的是Unix时间戳。你需要先把DateTime对象转换成时间戳,再让Date::Language按德语格式输出:

use DateTime qw( );
use Date::Language;

my $lang = Date::Language->new('German');
my $dt = DateTime->now( time_zone => 'local' )
                 ->set_time_zone('floating')
                 ->truncate( to => 'day' )
                 ->subtract( days => 1 );

# 将DateTime对象转为Unix时间戳
my $timestamp = $dt->epoch;
# 用德语格式输出日期
print $lang->time2str('%b%d', $timestamp);  # 输出 Dez08

之前的错误原因:

你之前的$yday_date是strftime('%b%d')生成的Dec08,把这个字符串传给time2str时,模块无法识别并将Dec转换为Dez——它要么解析失败,要么还是按英文逻辑处理,所以输出了错误的结果。

内容的提问来源于stack exchange,提问作者ste92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:43:06