Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我更改$ENV{TZ}时,为什么Windows7上ActivePerl中的localtime不正确?_Perl_Datetime_Timezone - Fatal编程技术网

当我更改$ENV{TZ}时,为什么Windows7上ActivePerl中的localtime不正确?

当我更改$ENV{TZ}时,为什么Windows7上ActivePerl中的localtime不正确?,perl,datetime,timezone,Perl,Datetime,Timezone,我在IIS服务器上使用Bugzilla,该服务器使用Perl的DateTime模块。不幸的是,时间显示不正确gmtime以GMT显示正确的时间,但是当我更改$ENV{TZ}时,localtime没有给出正确的时间 下面是一些代码来演示该问题: #C:\Perl64\bin/perl -w $ENV{TZ} = 'America/New_York'; my $now = scalar localtime; $TZone = $ENV{'TZ'}; print "It is now $now $

我在IIS服务器上使用Bugzilla,该服务器使用Perl的
DateTime
模块。不幸的是,时间显示不正确
gmtime
以GMT显示正确的时间,但是当我更改
$ENV{TZ}
时,
localtime
没有给出正确的时间

下面是一些代码来演示该问题:

#C:\Perl64\bin/perl -w
$ENV{TZ} = 'America/New_York';
my $now = scalar localtime;
$TZone =  $ENV{'TZ'}; 
print "It is now $now $TZone\n";

$ENV{TZ} = 'America/Los_Angeles';
my $now = scalar localtime;
$TZone =  $ENV{'TZ'}; 
print "It is now $now $TZone\n";

my $GMTime = scalar gmtime;
print "It is now $GMTime GMT\n";
这张照片是:

现在是2015年3月18日星期三17:02:46美国/纽约
现在是2015年3月18日星期三17:02:46美国/洛杉矶
现在是2015年3月18日星期三16:02:46 GMT
以下是预期结果:

现在是2015年3月18日星期三12:02:46美国/纽约
现在是2015年3月18日星期三9:02:46美国/洛杉矶
现在是2015年3月18日星期三16:02:46 GMT
以下是我的perl版本信息:

这是Perl5,版本20,Subversion1(v5.20.1),是为MSWin32-x64-multi-thread构建的
(对于1个注册补丁,请参阅perl-V以了解更多详细信息)
版权所有1987-2014,拉里·沃尔
ActiveState提供的二进制构建2000[298557]http://www.ActiveState.com
建成日期2014年10月15日14:56:57
Perl只能在艺术许可证或
GNU通用公共许可证,可以在Perl5源代码工具包中找到。
完整的Perl文档,包括常见问题列表,可以在
该系统使用“manperl”或“perldocperl”。如果您有权访问
Internet,将浏览器指向http://www.perl.org/,Perl主页。
我看到有人说你得跑了

POSIX::tzset();
在更改
$ENV{TZ}
之后,但当我尝试这样做时,我得到一个错误:

此体系结构上未实现POSIX::tzset。 以下是IIS的服务器日志。时间以UTC为单位,并且是正确的

#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2015-03-18 20:15:34
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2015-03-18 20:17:52 127.0.0.1 GET /bugzilla/skins/standard/show_bug.css - 80 - 127.0.0.1 Mozilla/5.0+(Windows+NT+6.1;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/42.0.2311.39+Safari/537.36 304 0 0 1
2015-03-18 20:17:52 127.0.0.1 GET /bugzilla/js/comments.js - 80 - 127.0.0.1 Mozilla/5.0+(Windows+NT+6.1;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/42.0.2311.39+Safari/537.36 304 0 0 24
2015-03-18 20:18:06 127.0.0.1 POST /bugzilla/process_bug.cgi - 80 - 127.0.0.1 Mozilla/5.0+(Windows+NT+6.1;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/42.0.2311.39+Safari/537.36 200 0 0 9498
2015-03-18 20:18:23 127.0.0.1 GET /bugzilla/show_bug.cgi id=1 80 - 127.0.0.1 Mozilla/5.0+(Windows+NT+6.1;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/42.0.2311.39+Safari/537.36 200 0 0 1164
我怎样才能解决这个问题


我们的解决方案是将Bugzilla移动到虚拟机上的Linux来宾操作系统。这就解决了问题。

更改
$ENV{TZ}
后需要调用
POSIX::tzset()
更改
$ENV{TZ}
后需要调用
POSIX::tzset()
更改
$ENV{TZ}
后需要调用
POSIX::tzset()
<更改
$ENV{TZ}

后,您发布的代码未使用

输出(来自CST):


您发布的代码未使用

输出(来自CST):


您发布的代码未使用

输出(来自CST):


您发布的代码未使用

输出(来自CST):

的文档解释了
$ENV{TZ}
的可接受格式:

设置TZ=tzn[+|–]hh[:mm[:ss]][dzn]

tzn:三个字母的时区名称,如PST。必须指定从本地时间到UTC的正确偏移量

hh:UTC和当地时间之间的小时差。正值的符号(
+
)可选

mm:分钟。用冒号(
)与hh分隔

ss:秒。用冒号(
)与mm分隔

dzn:三字母夏令时时区,如PDT。如果夏时制在当地从未生效,
设置TZ
,但不设置dzn值。C运行时库假定美国实施夏令时(DST)计算的规则

因此,以下工作:

C:\> perl -E "$ENV{TZ}='PST-8:00PDT';say scalar localtime" Wed Mar 18 15:44:57 2015 C:\>perl-E“$ENV{TZ}='PST-8:00PDT';表示标量本地时间” 2015年3月18日星期三15:44:57 但是,您会发现一些其他值也“起作用”,即使它们没有被记录在案:

C:\> set TZ='-08:00' C:\> perl -E "say scalar localtime" Wed Mar 18 12:27:33 2015 C:\>设置TZ='-08:00' C:\>perl-E“说标量本地时间” 2015年3月18日星期三12:27:33 C:\>设置TZ= C:\>perl-E“说标量本地时间” 2015年3月18日星期三15:28:03 C:\>perl-E“$ENV{TZ}=q{'-08:00};说标量localtime” 2015年3月18日星期三15:34:41 C:\>perl-E“$ENV{TZ}=q{'America/Los_Angeles'};说标量本地时间” 2015年3月18日星期三15:35:09的文档解释了
$ENV{TZ}
的可接受格式:

设置TZ=tzn[+|–]hh[:mm[:ss]][dzn]

tzn:三个字母的时区名称,如PST。必须指定从本地时间到UTC的正确偏移量

hh:UTC和当地时间之间的小时差。正值的符号(
+
)可选

mm:分钟。用冒号(
)与hh分隔

ss:秒。用冒号(
)与mm分隔

dzn:三字母夏令时时区,如PDT。如果夏时制在当地从未生效,
设置TZ
,但不设置dzn值。C运行时库假定美国实施夏令时(DST)计算的规则

因此,以下工作:

C:\> perl -E "$ENV{TZ}='PST-8:00PDT';say scalar localtime" Wed Mar 18 15:44:57 2015 C:\>perl-E“$ENV{TZ}='PST-8:00PDT';表示标量本地时间” 2015年3月18日星期三15:44:57 但是,您会发现一些其他值也“起作用”,即使它们没有被记录在案:

C:\> set TZ='-08:00' C:\> perl -E "say scalar localtime" Wed Mar 18 12:27:33 2015 C:\>设置TZ='-08:00' C:\>perl-E“说标量本地时间” 2015年3月18日星期三12:27:33 C:\>设置TZ= C:\>perl-E“说标量本地时间” 2015年3月18日星期三15:28:03 C:\>perl-E“$ENV{TZ}=q{'-08:00};说标量localtime” 2015年3月18日星期三15:34:41 C:\>perl-E“$ENV{TZ}=q{'America/Los_Angeles'};说标量本地时间” 2015年3月18日星期三15:35:09的文档解释了
$ENV{TZ}
的可接受格式:

设置TZ=tzn[+|–]hh[:mm[:ss]][dzn]

tzn:三个字母的时区名称,如PST。必须指定从本地时间到UTC的正确偏移量

hh:UTC和当地时间之间的小时差。正值的符号(
+
)可选

mm:分钟。用冒号(
)与hh分隔

ss:秒。用冒号(
)与mm分隔

dzn:三字母夏令时时区,如PDT。如果戴利 C:\> set TZ= C:\> perl -E "say scalar localtime" Wed Mar 18 15:28:03 2015 C:\> perl -E "$ENV{TZ}=q{'-08:00'};say scalar localtime" Wed Mar 18 15:34:41 2015 C:\> perl -E "$ENV{TZ}=q{'America/Los_Angeles'};say scalar localtime" Wed Mar 18 15:35:09 2015