用德语创建月份缩写 - 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::Languagetime2str,而不是使用格式字符串加上自 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

另见 the DateTime::Format::Builder tutorial