用德语创建月份缩写 - Perl
Create month abbrevation in german - 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
有人知道问题出在哪里吗?
任何答案表示赞赏!
您应该将 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";
您正在使用文字字符串调用 Date::Language 的 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/\.//;
这不是我要解决的问题,但它确实回答了如何使用 DateTime::Locale module linked in on 。
DateTime::Locale::de_DE 是为格式化程序提供数据以将日期格式化为区域设置的包之一。它有不同的方法来提供该数据。您特别链接到的那个(缩写(独立)
) 在日期的某个组成部分单独使用而不是在表单中使用时使用。还有一个名为 Abbreviated (format) 的第二个块具有点。
这些由具有相似名称的 DateTime::Locale::* 对象上的方法使用。我们想要 month_stand_alone_abbreviated
,但在调用时,它 return 是一个月份名称列表。
因为你要用的不是真正的格式字符串,strftime
会做,我们自己做。 You can implement your own 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 ,获取月份列表,然后 return 您想要的字符串。这很幼稚,但它确实有效。
这样使用:
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
。
我想要特定格式的 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
有人知道问题出在哪里吗? 任何答案表示赞赏!
您应该将 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";
您正在使用文字字符串调用 Date::Language 的 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/\.//;
这不是我要解决的问题,但它确实回答了如何使用 DateTime::Locale module linked in
DateTime::Locale::de_DE 是为格式化程序提供数据以将日期格式化为区域设置的包之一。它有不同的方法来提供该数据。您特别链接到的那个(缩写(独立) ) 在日期的某个组成部分单独使用而不是在表单中使用时使用。还有一个名为 Abbreviated (format) 的第二个块具有点。
这些由具有相似名称的 DateTime::Locale::* 对象上的方法使用。我们想要 month_stand_alone_abbreviated
,但在调用时,它 return 是一个月份名称列表。
因为你要用的不是真正的格式字符串,strftime
会做,我们自己做。 You can implement your own 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 ,获取月份列表,然后 return 您想要的字符串。这很幼稚,但它确实有效。
这样使用:
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
。