【问题标题】:Get ISO DateTime with only core modules in Perl?在 Perl 中仅使用核心模块获取 ISO DateTime?
【发布时间】:2015-06-18 23:38:44
【问题描述】:

我想得到一个日期时间字符串,例如2015-06-17 10:20:34,只有核心模块。原因是cpan install DateTime 在我的机器上花费了很长时间,因为测试和所有依赖项的获取。

如果我将我的程序提供给我的同事。他们还需要安装缺少的模块。但是,如果我只是这样做:

 my $date = `date "+%Y-%m-%d %H:%M:%S"`; chomp $date;

它只需要一行,不需要额外的模块,适用于所有 POSIX 机器。

在这种情况下我为什么需要安装DateTime

然而DateTime->now 是google 推荐的解决方案。我认为不应该,我认为我错了,我不知道为什么。

【问题讨论】:

  • 你使用的是什么 Perl 版本?
  • $ perl -v This is perl 5, version 14, subversion 4 (v5.14.4) built for cygwin-thread-multi-64int
  • ISO 8601 date-time format 看起来像2015-06-17T10:20:34

标签: perl


【解决方案1】:

Perl 5.14 包含 core module Time::Piece,它有一个 datetime 方法,该方法返回 ISO 8601 中的日期和时间。

use Time::Piece;
my $t = localtime;
say $t->datetime;

这将返回2015-06-17T10:59:15。如果您不想要 T,请将其删除。

say localtime->datetime =~ y/T/ /r;

【讨论】:

  • Time::Piece 是 5.9.5 的核心。 (你可以通过corelist Time::Piece看到这个)
  • 为什么不直接使用strftime 并给它想要的格式呢?似乎比采用不同的格式然后对其进行正则表达式要好得多。
  • 真@LeoNerd。但是好吧,我会留下它,因为我认为很多人一直忘记 Time::Piece,包括我在内。 ;)
  • 我认为他的意思是 T::P 的 strftime
  • OP 还要求提供 ISO 日期和时间,它具有T。请参阅en.wikipedia.org/?title=ISO_8601,因此使用该方法很有意义。
【解决方案2】:

大约八年前,Time::Piece 模块自 Perl 5.10 版起就已存在于核心中

它覆盖了localtime核心函数,看起来像这样

use Time::Piece;

print localtime->datetime;

输出

2015-06-17T12:55:36

如果您真的想要一个空格而不是标准的T,那么在 Perl v5.14 或更高版本上您可以编写

print localtime->datetime =~ tr/T/ /r;

在没有/r“非破坏性”选项的早期版本中,您必须将字符串放入变量中并使用tr/T/ /修改它

【讨论】:

    【解决方案3】:

    使用POSIX 函数strftime 很简单:

    use POSIX qw( strftime );
    
    print strftime "%Y-%m-%d %H:%M:%S", localtime;
    

    POSIX 自 5.0 以来一直是核心。

    【讨论】:

      【解决方案4】:

      Time::Piece 为您提供了具有许多有用方法的对象。正如其他人指出的那样,datetime() 以 ISO 格式为您提供日期和时间。

      use Time::Piece;
      
      print localtime->datetime;
      

      但如果您想要不同的格式(例如您问题中的“不太 ISO”格式),您可以使用 strftime() 方法。

      use Time::Piece;
      
      print localtime->strftime('%Y-%m-%d %H:%M:%S');
      

      其他几点:

      • 如果您使用预构建的软件包(例如,RedHat 派生系统上的 yum install perl-DateTime),您的 DateTime 安装可能会更快。
      • 避免使用 shell 来运行系统命令有两个原因 - 首先,您会失去跨平台兼容性,其次,创建新 shell 是一项相对缓慢且成本高昂的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 2012-11-27
        • 2021-12-30
        • 1970-01-01
        • 2015-10-22
        相关资源
        最近更新 更多