用德语Perl创建月份缩写



我想要perl中特定格式的昨天日期。

我的脚本:

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

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

print $lang ->time2str($yday_date)

我得到的:

2008年12月

我需要什么

Dez08

有人知道问题出在哪里吗?欢迎回答!

您调用Date::Language的time2str时使用的是文字字符串,而不是格式字符串加上1970年以来的时间。

但您根本不需要Date::语言,DateTime可以自己处理本地化。

试试这个:

use strict;
use warnings;
use DateTime;
my $yday_date =
DateTime
->now( time_zone => 'local', locale => 'de' )
->set_time_zone('floating')
->truncate( to => 'day' )
->subtract( days => 1 )
->strftime('%b%d');

print $yday_date;

编辑:如果您需要像Dez08而不是Dez.08这样的字符串,我不会向组合中添加另一个模块,只需删除.即可解决。类似于:

$yday_date =~ s/.//;

您应该将time与格式化字符串一起传递给语言对象。

示例:

use DateTime qw( );
use Date::Parse;
use Date::Language;
my $lang = Date::Language->new('German');
my $yday_date =
DateTime
->now( time_zone => 'local' )
->set_time_zone('floating')
->truncate( to => 'day' )
->subtract( days => 1 )
->epoch;
print $lang->time2str('%b%d', $yday_date) . "n";

这不是我想要解决的问题,但它确实回答了如何使用在OP对mscha答案的评论中链接的DateTime::Locale模块。

DateTime::Locale::de_de是为格式化程序提供数据以将日期格式化为区域设置的包之一。它有不同的方法来提供这些数据。当日期的某个组成部分单独使用时,而不是以表格形式使用时,会使用您链接到的特定块(缩写(独立((。还有一个名为

简写(格式(这些由类似名称的DateTime::Locale::*对象上的方法使用。我们想要month_stand_alone_abbreviated,但当调用时,它会返回一个月名称列表。

因为您想要使用的不是在实际的格式字符串中使用,而strftime会这样做,所以我们可以自己做。您可以实现您自己的DateTime::格式,该格式正是您所需要的,针对这种非常特殊的情况。

免责声明:我不知道这是否是正确的方法,而且它可能是不完整的,除了这个非常具体的用例之外,在任何情况下都不起作用。它也无法正确解析传入日期。我没有去查它是怎么工作的。它需要一个解析器才能工作,所以我写了一个可能是错误的解析器。

package DateTime::Format::GermanOhnePunkt;
use DateTime::Format::Builder (
parsers => {
parse_date => [ {
regex => qr/^(...)(..)$/,
params => [qw(month day)]
}
]});
sub format_datetime {
my ($self, $dt) = @_;
my @months = $dt->locale->month_stand_alone_abbreviated;
return sprintf '%s%02d', $months[0][$dt->month - 1], $dt->day;
}

所做的只是获取DateTime::Locale,获取月份列表,然后返回所需的字符串。这很天真,但很管用。

这样使用:

my $yday_date =
DateTime
->now( 
time_zone => 'local', 
locale    => 'de_DE', 
formatter => DateTime::Format::GermanOhnePunkt->new,
)
->set_time_zone('floating')
->truncate( to => 'day' )
->subtract( days => 1 );
print $yday_date;

这将在今天编写本文时输出Dez08

另请参阅DateTime::Format::Builder教程。

最新更新