我正在为新程序员编写一些培训材料,其中我讨论的是HTTP头,所以我正在尝试手动设置Last-Modified。我已经把一切都安排好了,除了把文件时间拿到格林尼治标准时间。以下是我到目前为止所掌握的:
问题是:给定可以在任何时区运行的stat($fh)->mtime,需要添加哪些代码才能转换为GMT
my $scriptFilename = $ENV{'SCRIPT_FILENAME'};
my $timestamp;
my $fh = FileHandle->new;
if ($fh->open("< ${scriptFilename}")) {
$timestamp = time2str("%a, %e %b %Y %X %Z", stat($fh)->mtime);
$fh->close;
}
#Last-Modified: Tue, 15 Oct 2019 12:45:26 GMT
print <<"END";
Content-type: text/html; charset=iso-8859-1
Last-Modified: $timestamp
<html>
...
</html>发布于 2020-01-26 00:38:16
来自Date::Format包的time2str (我假设这就是time2str的来源)接受一个可选的第三个参数来指定时区。
$timestamp = time2str("%a, %e %b %Y %X %Z", stat($fh)->mtime, 'UTC');发布于 2020-01-26 04:34:58
这里似乎有一些混淆: mtime的结果不是在任何时区,它是从一个固定的时间点的纪元开始的秒数(除了被忽略的闰秒)。因此,你需要做的就是用你想要的时区来表示它,也就是UTC。另一个答案提到了如何使用您一直使用的函数来实现这一点,但是将时间格式化为字符串的常用函数是strftime,它是由几个核心模块提供的。
use strict;
use warnings;
use POSIX 'strftime';
# gmtime interprets the mtime seconds in UTC
my $timestamp = strftime "%a, %e %b %Y %X %Z", gmtime $mtime;
use Time::Piece 'gmtime';
my $timestamp = gmtime($mtime)->strftime("%a, %e %b %Y %X %Z");但您的用例实际上是一个特定的日期格式,HTTP协议使用的日期格式,并且将始终采用GMT/UTC格式。有一个这样的模块:HTTP::Date
use strict;
use warnings;
use HTTP::Date 'time2str';
my $timestamp = time2str $mtime;发布于 2020-01-26 00:27:16
基本上
my $dt = DateTime->new(
year => 2000,
month => 5,
day => 10,
hour => 15,
minute => 15,
time_zone => 'America/Los_Angeles',
);
print $dt->hour; # prints 15
$dt->set_time_zone( 'America/Chicago' );
print $dt->hour; # prints 17有关如何格式化输出的信息,请参阅here。
https://stackoverflow.com/questions/59911039
复制相似问题