【问题标题】:Perl timezone conversion - but only using core modulesPerl 时区转换 - 但仅使用核心模块
【发布时间】:2013-05-04 14:42:15
【问题描述】:

是否可以仅使用 Perl 核心模块为将来的“任意”日期进行时区转换?

假设我在时区 X 中有 Day:month:year, hr:min(假设它是一个完全合格的时区,如 America/New_York),我需要将其转换为时区 Y(比如 Asia/Kolkata)

一些注意事项:

1) 这适用于 OSX(Lion 或更高版本)

2) 我知道如何使用 DateTime 和 DateManip,但这些不是核心模块,需要安装 C 编译器。我正在尝试将我的程序分发给“非技术”用户——他们可以在帮助下安装 perl 模块,但在尝试让 XCode、命令行工具等工作时崩溃了。有些人试图安装 DateTime 但他们陷入了错误/依赖关系并放弃了。

3) 我尝试使用 tzset 的组合;和 ENV TZ - 但不能用于任意日期 - 仅适用于当地时间(这意味着,我可以将“现在时间”转换为任何时区)

【问题讨论】:

  • 分发你的程序,所有依赖项都已经编译 → PAR::Packer 或其他。这样,您也可以使用最新的 perl。但从长远来看,自动化或以其他方式简化编译器安装会更好。
  • 我了解 OP 的问题。在 OS X 上安装 Xcode(下载 >1GB)只是因为“需要编译一个 perl 模块”不是最佳解决方案。你知道任何好的手册(带有示例和“足够深入”的解释)如何分发带有预编译模块和/或(嵌入 perl)的 perl 应用程序吗?这也让我很感兴趣 :)
  • 另外,一般要小心未来的日期。时区规则随政客的心血来潮而变化。 :)
  • @amon 谢谢。我发现 PAR::Packer 偶尔会出现问题 - 它有时不包含 all 依赖项,我需要做很多实验。

标签: perl timezone perl-core


【解决方案1】:

使用POSIX 核心模块。示例:

use POSIX;

$ENV{TZ} = 'Europe/Madrid';
$time_t = POSIX::mktime( 10, 30, 17, 4, 4, 113 );
print POSIX::ctime($time_t); #<-- prints: Sat May  4 17:30:10 2013

$ENV{TZ} = 'Europe/London';
print POSIX::ctime($time_t); #<-- prints: Sat May  4 16:30:10 2013

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 2017-09-17
    • 2015-09-14
    • 2011-05-31
    • 2011-12-25
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多