识别Perl中的日期字符串

时间:2015-10-13 13:11:58

标签: perl date parsing

我有一个处理大量数据的脚本。进入的一些数据字段是日期或时间戳。

当我遇到日期/时间戳时,我需要将其从当地时间转换为GMT。显然,如果字段不是日期或时间戳,我不想尝试此转换。问题是,我不知道日期或时间戳字段的格式。

Scalar::Util有一个looks_like_number函数来确定变量"看起来像一个数字"。是否有识别日期或时间戳的等效功能?

1 个答案:

答案 0 :(得分:4)

考虑一般情况 - 你可以用很多不同的方式来编写日期。这就是为什么大多数系统都没有,并在内部使用数字时间码,并根据要求格式化日期。

其中最重要的是数字隐含的模糊性 - 按照惯例,美国的日期格式是月/日,但世界其他地方的很多人都使用日/月。

但是,我可能会采用的方法是 - 假设您包含您尝试处理的字段 - 请使用类似strptime的内容来解析日期到时间戳,验证时间戳(例如,给定数据是否合理),如果是,则认为是正确的。

E.g:

#!/usr/bin/env perl

use strict;
use warnings;
use Time::Piece;

my @formats = ( '%Y/%m/%d %H:%M:%S', '%d %b %y', );

my @example_strs = ( '14 Oct 15', '2014/08/22 17:42:33', 'bogus' );


foreach my $example_str (@example_strs) {
    my $timestamp; 
    foreach my $format (@formats) {
        if ( not defined $timestamp 
             and $timestamp =
            eval { localtime->strptime( $example_str, $format ) } )
        {
            print "$example_str converted to $timestamp using $format\n";
        }
    }
    print "Couldn't parse $example_str" unless $timestamp;
}

您还可以在$timestamp上添加一些范围检查,以确保日期合理。

e.g。

if ( $timestamp < time() - 365 * 60 * 60 
  or $timestamp > time() + 84700 )  {
   #assume it's invalid. 
}

这也适用于整数验证 - 但如果您的整数值足够接近time(),则无法区分它们。 (从统计学上讲,如果它在那个范围内,它可能会被锁定时间)

但是稍微浏览strftime以查看有多少格式选项。