3

所以我正在使用 Perl 的 CGI 模块创建 cookie,我是这样做的:

my $cookie = CGI::Cookie->new(-name    =>  "$name",
                         -value   =>  "$val",
                         -expires =>  "$expiration_date",
                         -path    =>  $cookie_path,
                         -secure  =>  0
                        );

print "Set-Cookie: $cookie\n";

并且cookie是在浏览器中设置的,唯一的问题是时间与我设置的过期日期不匹配。例如,如果我将 +1d 设置为到期日期,它实际上会执行类似于 +1d 的操作 - 几个小时。我检查了我的系统时间,看看是否是问题所在,但我的系统时间是正确的。然后我打印出 cookie,我得到了这个:

Actual Time of cookie creation: 6/4/2012 12:10:02 PM    
COOKIE: session_id=534fec49c864d8cf0325779b0921b6be1338829802484; path=/; expires=Tue, 05-Jun-2012 17:10:02 GMT

上面的诡异之处在于,我使用 perl 的“localtime(time())”函数记录了 cookie 创建的实际时间,但它记录的时间与我的 date 命令输出的时间不同(所以不是实际的当前时间)!然后cookie上的过期时间实际上是正确的,但是它在错误的时区。

date因此,当我运行命令时,我的服务器位于东部时区:

Mon Jun  4 12:05:12 EST 2012

但是,cookie 设置为 GMT 作为时区,我认为这是问题所在。除了 just 之外,还有其他时间我应该在服务器上设置date吗?如果有帮助的话,我正在 CentOS 5 上运行。谢谢!

4

2 回答 2

6

这些时间实际上是等价的(美国东部标准时间 12:00 是格林威治标准时间 17:00)。请注意,规范要求使用 cookie 以 GMT 指定到期时间。反过来,您的浏览器需要自动将时区转换回来。

简而言之:一切都在按理说。

于 2012-06-04T21:31:13.197 回答
4
但它记录的时间与我的日期命令输出的时间不同

这不是真的。

Tue, 05-Jun-2012 17:10:02 GMT

Tue, 05-Jun-2012 12:10:02 EST

是同一时间的不同表示。这里没有问题。如果你得到了就会有问题

Tue, 05-Jun-2012 17:10:02 EST

或者

Tue, 05-Jun-2012 12:10:02 GMT

但你没有。

使用 GMT 是因为“EST”不明确——澳大利亚有一个同名的时区——而且如果每个人都使用 GMT,则只需要知道一个时区而不是所有时区。

于 2012-06-04T21:43:47.490 回答