【问题标题】:How can I parse a strftime formatted string in Perl?如何在 Perl 中解析 strftime 格式的字符串?
【发布时间】:2010-07-03 02:30:21
【问题描述】:

我是 Perl 新手,我想知道 strftime() 是否有反函数。 看,

use POSIX qw(strftime);
print strftime("%YT%mT%d TTTT%H:%M:%S", localtime) 

我得到:2009T08T14 TTTT00:37:02。我该如何做相反的操作?从“2009T08T14 TTTT00:37:02”字符串到2009-08-14 00:37:02,知道格式化字符串“%YT%mT%d TTTT%H:%M:%S”吗?

【问题讨论】:

  • 等等,我回答得太快了。你的意思是,你想要字符串 2009-08-14 00:37:02 还是自纪元以来的秒数?
  • 我想从字符串 2009T08T14 TTTT00:37:02 中获取时间,以便将其与“有效”时间戳进行比较。

标签: perl datetime


【解决方案1】:

一种选择是使用正则表达式解析数字,然后使用Time::Local。但是,既然我明白了您的问题是如何从strftime 格式化字符串转换为一般时间,那么这种方法肯定会很麻烦。

您在回答中提到POSIX::strptime,如果您的平台支持它,那就太好了。或者,您可以使用DateTime::Format::Strptime

#!/usr/bin/perl

use strict;
use warnings;

use DateTime::Format::Strptime;
use POSIX qw(strftime);

my $f = "%YT%mT%d TTTT%H:%M:%S";
my $s = strftime($f, localtime);

print "$s\n";

my $Strp = DateTime::Format::Strptime->new(
    pattern   => $f,
    locale    => 'en_US',
    time_zone => 'US/Eastern',
);

my $dt = $Strp->parse_datetime($s);

print $dt->epoch, "\n";
print scalar localtime $dt->epoch, "\n";

$dt 是一个DateTime 对象,所以你可以用它做几乎任何你想做的事情。

【讨论】:

  • 好的,但是如果我有一个函数,其参数是格式化字符串(这里例如“%YT%mT%d TTTT%H:%M:%S”)但我没有确切地知道它..所以,我正在寻找 strftime 函数的对立面。
  • 不,只使用 DateTime::Format::Strptime 代替。
【解决方案2】:

我想我找到了解决方案:strptime($strptime_pattern, $string)

【讨论】:

【解决方案3】:

很简单

use Time::ParseDate;
my $t = '2009T08T14 TTTT00:37:02';

$t =~ s/TTTT//;
$t =~ s/T/-/g;

$seconds_since_jan1_1970 = parsedate($t)

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2015-03-11
    • 2014-07-19
    • 2015-07-12
    • 2019-05-07
    • 2017-01-13
    • 1970-01-01
    • 2016-06-12
    • 2013-04-21
    相关资源
    最近更新 更多