18

Perlで日付をRFC822形式でエレガントに出力するにはどうすればよいですか?

4

4 に答える 4

30
use POSIX qw(strftime);
print strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time())) . "\n";
于 2008-10-05T15:12:41.027 に答える
15

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() );

更新:特定のタイムゾーンの時間を指定するには、now()にtime_zone引数を追加します。

DateTime->now( time_zone => $ENV{'TZ'}, ... )
于 2008-10-05T17:40:51.853 に答える
5

で実行できますstrftimeが、その%a(日) と%b(月) は現在のロケールの言語で表されます。

からman strftime:

%a 現在のロケールに従った省略された曜日名。
%b 現在のロケールに従った省略された月の名前。

メールの Date フィールドでは、次の名前のみを使用する必要があります ( rfc2822 DATE AND TIME SPECIFICATIONより):

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";
于 2016-10-20T08:40:42.300 に答える