用德语创建月份缩写-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)
我得到的:
12月08日
我需要的
德兹08
有谁知道问题是什么?任何答案表示赞赏!
回答
你打电话日期::语言的time2str一个文本字符串,不能以格式字符串加上1970年以来第二次的时间。
但是您根本不需要 Date::Language,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/.//;
- Thank you! I did this too but the result is 'Dez.08'. I just need it without the dot. I found this but does not know how use that: https://metacpan.org/pod/distribution/DateTime-Locale/lib/DateTime/Locale/de_DE.pod#Abbreviated-(stand-alone)1
回答
您应该将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's answer的评论中链接的DateTime::Locale 模块。
DateTime::Locale::de_DE 是为格式化程序提供数据以将日期格式化为语言环境的包之一。它有不同的方法来提供这些数据。
当日期的某个组成部分单独使用时,您特别链接到的那个(缩写(独立))被使用,而不是在一种形式中。还有一个叫做Abbreviated (format) 的块,里面有点。
这些由类似名称的 DateTime::Locale::* 对象上的方法使用。我们想要month_stand_alone_abbreviated,但是当被调用时,它返回一个月份名称列表。
因为你要使用的不是在实际格式字符串中使用的,这是strftime可以做的,我们可以自己做。对于这种非常特殊的情况,您可以实现自己的 DateTime::Format 来满足您的需求。
免责声明:我不知道这是否是正确的方法,它可能是不完整的,除了这个非常具体的用例外,在任何情况下都不起作用。它也不会正确解析传入日期。我没有费心去查找它是如何工作的。它需要一个解析器才能工作,所以我写了一个可能是错误的。
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 教程。