确定另一个时区的本地时间

时间:2011-01-11 19:47:59

标签: perl timezone gmt localtime

如何使用在美国服务器上执行的PERL脚本确定各个国家/地区的当前日期和时间?例如,getDTnow()应确定服务器上的当前日期和时间,并使用它来返回各个国家/地区的日期和时间。

P.S :如果只使用内置函数就可以完成,而不需要任何外部模块。


结论:日期数学是 [在这里使用咒骂] 复杂且容易出错。 IRC上的其他perl专家,小组和网络的其他部分确认 Ether 一直在建议我 - 使用DateTime。对于那些不介意搞乱perl环境的人来说, DVK 的解决方案也非常简洁。 (注意:虽然在Windows上,Time::Piece docs的警告部分表示在“在Win32上的线程中设置$ ENV {TZ} 时应该小心”

3 个答案:

答案 0 :(得分:6)

DateTime是一个很棒的图书馆,可以使用标准时区来完成你想要的一切,而且更多:

use DateTime;

# returns local time in Italy
my $dt = DateTime->now(time_zone => 'Europe/Rome');

# prints time in desired format
print "The current date and time in Italy is: ", $dt->strftime('%Y-%m-%d %T');

答案 1 :(得分:2)

您可以通过TZ环境变量控制本地时间返回的时区:

local $ENV{TZ} = ":/usr/share/lib/zoneinfo/Asia/Tokyo";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(); 
print "$sec,$min,$hour,$mday,$mon,$year,$wday,$yday\n"'
# Prints 40,58,4,12,0,111,3,11

local $ENV{TZ} = ":/usr/share/lib/zoneinfo/Europe/London";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(); 
print "$sec,$min,$hour,$mday,$mon,$year,$wday,$yday\n"'
# Prints 41,58,19,11,0,111,2,10

不幸的是,上面的路径在不同的Unix上是不同的(Solaris上的/usr/share/lib/zoneinfo,Linux上的/usr/share/zoneinfo。由于似乎没有其他变体,轻微可移植版本将检查两个目录中的哪一个存在并使用它 - 但这显然只适用于Solaris和Linux,可能是其他unix。不知道Windows / MacOS /诸如此类。

可以在此处找到TZ的有效位置:http://www.timezoneconverter.com/cgi-bin/tzref.tzc(但并非所有这些位置都必须在您的系统上可用 - 请查看上面的目录)。

有关TZ数据库的更多信息,请参阅http://en.wikipedia.org/wiki/Tz_database

答案 2 :(得分:0)

您始终可以将时区中的变体存储在哈希中,其中键是时区,值是从当前时间开始的调整。然后当你传递当前时间时,它应该返回该区域的本地时间。