在编写Perl脚本时,我经常发现需要获取以字符串形式表示的当前时间,该字符串的格式为YYYY-mm-dd HH:MM:SS(例如2009-11-29 14:28:29)。

在执行此操作时,我发现自己走的路很繁琐:

  • man perlfunc
  • /localtime搜索本地时间-重复五次(/ + \n)到达手册页
  • 的相关部分
  • 将字符串($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);从联机帮助页复制到我的脚本中。
  • 尝试使用my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec);
  • 记住问题#1:必须将$ year加1900才能获得当前年份。
  • 尝试使用my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec);
  • 记住问题#2:必须将$ mon加1才能获得当前月份。
  • 尝试使用my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
  • 似乎还可以。做完了!

  • 尽管上述过程有效,但远非最佳。我敢肯定有一种更聪明的方法,所以我的问题很简单:

    在Perl中获取当前日期/时间的YYYY-mm-dd HH:MM:SS的最简单方法是什么?

    “简单”既包括“易于编写”又包括“易于记忆”。

    最佳答案

    在标准 strftime 模块中使用POSIX。 Perl绑定(bind)中 strftime 的参数旨在与 localtime gmtime 的返回值保持一致。相比

    strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
    


    my          ($sec,$min,$hour,$mday,$mon,$year,$wday,     $yday,     $isdst) = gmtime(time);
    

    示例命令行用法是
    $ perl -MPOSIX -le 'print strftime "%F %T", localtime $^T'
    

    或从源文件中
    use POSIX;
    
    print strftime "%F %T", localtime time;
    

    某些系统不支持%F%T速记,因此您必须明确使用
    print strftime "%Y-%m-%d %H:%M:%S", localtime time;
    

    要么
    print strftime "%Y-%m-%d %H:%M:%S", gmtime time;
    

    请注意, time 在被调用时返回当前时间,而 $^T 固定为程序启动时的时间。使用 gmtime ,返回值是格林尼治标准时间的当前时间。使用 localtime 检索您当地时区的时间。

    关于perl - 在Perl中快速到达YYYY-mm-dd HH:MM:SS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1814196/

    10-11 04:13