2

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

PS:如果这可以仅使用内置函数完成,而不需要任何外部模块,那就太好了。


结论:日期数学[在这里使用脏话]复杂且容易出错。IRC、团体和网络其他部分的其他 perl 专家证实了Ether对我的建议——使用DateTimeDVK的解决方案对于那些不介意弄乱 perl 环境的人来说也非常简洁。(注意:尽管在 Windows 上, Time::Piece 文档的警告部分说在“在 Win32 上的线程中设置 $ENV{TZ} ”时应该小心)。

4

3 回答 3

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');
于 2011-01-11T20:25:28.870 回答
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 上是不同的(/usr/share/lib/zoneinfo在 Solaris 上,/usr/share/zoneinfo在 Linux 上)。由于似乎没有其他变体,因此稍微可移植的版本将检查 2 个目录中的哪一个存在并使用它 - 但这显然仅适用于 Solaris 和 Linux,并且可能是其他 unix。不知道 Windows/MacOS/whatnot。

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

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

于 2011-01-11T20:00:34.527 回答
0

您始终可以将时区的变化存储在哈希中,其中键是时区,值是当前时间的调整。那么当您通过当前时间时,它应该返回该区域的本地时间。

于 2011-01-11T19:58:36.053 回答