【问题标题】:Determining Local Time in another Timezone确定另一个时区的本地时间
【发布时间】:2011-06-07 09:48:03
【问题描述】:

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

P.S:如果只使用内置函数而不需要任何外部模块,那就太好了。


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

【问题讨论】:

  • 关于“没有任何外部模块”——你需要阅读"But I can't use CPAN!"
  • @Ether:感谢您的链接。这是一本有趣的书。我不想使用任何模块,因为我正在学习 perl。如果一个内置函数可以完成简单的任务,为什么要导入一个 perl 模块,它可以做很多我的脚本永远不会使用的其他事情? (我们不要忘记 TIMTOWTDI :)。
  • 时间计算简单,因为有很多边缘情况。如果有一个模块已经为您完成了所有边缘情况的调试和实现,您应该使用它,而不是尝试重新发明轮子。您可以随时打开引擎盖了解它是如何做到的——代码随时可供检查。
  • 学习 Perl 的一部分就是学习 CPAN。

标签: perl timezone gmt localtime


【解决方案1】:

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');

【讨论】:

  • 是的,我正在寻找类似的东西,但我想避免使用任何模块。反正有没有用 gmtime() 做类似的事情?
  • @Sam:阅读我上面提供的链接。避免使用任何模块是徒劳的。
  • 我并不反对使用模块。但我想知道这是否可以使用任何内置函数来完成。
【解决方案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

【讨论】:

  • gmtime() 不会比 localtime() 更合适 - 不必干预环境变量......我被困在如何“传递”一个时区来获得该区域的日期/时间。
  • @Sam - 我可能误解了你,但我认为你要求的“各个国家的当前日期和时间”是当地时间(localtime 返回)。
  • @Sam - “如何通过时区”部分是 ENV{TZ} 分配。
  • 别忘了调整夏令时!
  • @Sam:不,UTC 中没有 DST,但当地时间有 DST。您还必须手动考虑 DST 何时生效,并记住 DST 何时生效(如果有的话!)取决于位置。日期争吵是由特殊情况和愚蠢的当地惯例组成的可怕混乱,滚动你自己会做的唯一事情就是产生错误并教你永远不要再这样做了。
【解决方案3】:

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

【讨论】:

  • 逻辑对我来说也很清楚。但是我们如何在 perl 中实现呢?
  • @Sam - 它已经在 Unix 中实现了。请参阅我的回答,了解如何利用它。
猜你喜欢
  • 2016-05-22
  • 2011-07-13
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多