【问题标题】:Perl convert time in localtime format to YYYYMMDDPerl 将本地时间格式的时间转换为 YYYYMMDD
【发布时间】:2020-07-30 14:32:41
【问题描述】:

我有一个包含此格式日期的字符串

my $time = 'Fri Jan  8 14:24:27 2016';

我想将其转换为 YYYYMMDD。 我尝试了几个选项,例如:

use POSIX qw(strftime);
print strftime("%Y%m%d", $time);

但这行不通。 尝试了localtime($time) 以及许多其他方法,但它不起作用。

我想我需要将其转换为中间格式?

注意:我需要使用 strftime/POSIX,因为由于多种原因我无法调用其他模块。 (没有日期::时间等)

提前致谢,

【问题讨论】:

  • strftime 将 unix 纪元时间戳(自 1970 年初以来的非闰秒数,UTC+0)转换为字符串。您需要先将输入字符串转换为纪元时间戳,然后才能使用strftime

标签: perl time posix strftime localtime


【解决方案1】:

使用Time::Piece,自 2007 年起成为 Perl 核心的一部分:

use Time::Piece;

my $time = 'Fri Jan  8 14:24:27 2016';
say Time::Piece->strptime($time, '%a %b %d %H:%M:%S %Y')->ymd("");

【讨论】:

    【解决方案2】:

    您正在尝试错误地使用POSIX::strftime()。检查the documentation 总是一个好主意,上面写着:

    strftime
    

    将日期和时间信息转换为字符串。返回字符串。

    简介:

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

    月份 (mon)、工作日 (wday) 和年份 (yday) 从零开始,即一月是 0,而不是 1;星期日是 0,而不是 1; 1 月 1 日是 0,而不是 1。年份 (year ) 以 1900 年以来的年数给出,即 1995 年是 95; 2001 年是 101。有关这些和其他参数的详细信息,请参阅系统的 strftime() 联机帮助页。

    因此,将包含日期时间的随机(ish)表示的字符串传递给它有点乐观。

    您需要解析字符串并提取需要传递给strftime() 的位。正如您已经看到的那样,Modern Perl 做到这一点的方法是使用像 Time::Piece 这样的模块。但是使用标准 Perl 也完全可以做到这一点。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use feature 'say';
    use POSIX 'strftime';
    
    my $time = 'Fri Jan  8 14:24:27 2016';
    
    my ($day, $mon, $date, $hr, $min, $sec, $year) = split /[\s:]+/, $time;
    
    my %months = (
      Jan => 0, Feb => 1, Mar => 2, Apr => 3,
      May => 4, Jun => 5, Jul => 6, Aug => 7,
      Sep => 8, Oct => 9, Nov => 10, Dec => 11,
    );
    
    $time = strftime('%Y%m%d',
                     $sec, $min, $hr, $date, $months{$mon}, $year - 1900);
    
    say $time;
    

    但不要那样做。使用模块。

    【讨论】:

      猜你喜欢
      • 2016-05-31
      • 2011-01-23
      • 2015-12-22
      • 2017-12-02
      • 2012-02-18
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多