Как я могу элегантно распечатать дату в формате RFC822 в Perl?
Как мне элегантно распечатать дату в формате RFC822 на Perl?
Ответ 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";