Подтвердить что ты не робот

Как мне элегантно распечатать дату в формате RFC822 на Perl?

Как я могу элегантно распечатать дату в формате RFC822 в Perl?

4b9b3361

Ответ 1

use POSIX qw(strftime);
print strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time())) . "\n";

Ответ 2

Набор DateTime предоставляет несколько способов, например:

use DateTime;
print DateTime->now()->strftime("%a, %d %b %Y %H:%M:%S %z");

use DateTime::Format::Mail;
print DateTime::Format::Mail->format_datetime( DateTime->now() );

print DateTime->now( formatter => DateTime::Format::Mail->new() );

Обновление: чтобы указать время для определенного часового пояса, добавьте аргумент time_zone to now():

DateTime->now( time_zone => $ENV{'TZ'}, ... )

Ответ 3

Это можно сделать с помощью strftime, но его %a (день) и %b (месяц) выражаются на языке текущей локали.

От man strftime:

% a Сокращенное название дня недели в соответствии с текущим языковым стандартом.
   % b Сокращенное название месяца в соответствии с текущим языковым стандартом.

Поле Date в письме должно использовать только эти имена (из rfc2822 ДАТА И ВРЕМЯ СПЕЦИФИКАЦИЯ):

day         =  "Mon"  / "Tue" /  "Wed"  / "Thu" /  "Fri"  / "Sat" /  "Sun"

month       =  "Jan"  /  "Feb" /  "Mar"  /  "Apr" /  "May"  /  "Jun" /
               "Jul"  /  "Aug" /  "Sep"  /  "Oct" /  "Nov"  /  "Dec"

Поэтому переносимый код должен переключиться на локаль C:

use POSIX qw(strftime locale_h);

my $old_locale = setlocale(LC_TIME, "C");
my $date_rfc822 = strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time()));
setlocale(LC_TIME, $old_locale);

print "$date_rfc822\n";