用德语创建月份缩写-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 教程。


以上是用德语创建月份缩写-Perl的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>