如何在Perl中优雅地以RFC822格式打印日期?
use POSIX qw(strftime); print strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time())) . "\n";
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'}, ... )
它可以用strftime
,但它%a
(日)和%b
(月)用当前语言环境的语言表示.
来自man strftime
:
%a根据当前区域设置缩写的工作日名称.
%b根据当前区域设置的缩写月份名称.
邮件中的日期字段必须仅使用这些名称(来自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";