我有一个处理大量数据的脚本。进入的一些数据字段是日期或时间戳。
当我遇到日期/时间戳时,我需要将其从当地时间转换为GMT。显然,如果字段不是日期或时间戳,我不想尝试此转换。问题是,我不知道日期或时间戳字段的格式。
Scalar::Util
有一个looks_like_number
函数来确定变量"看起来像一个数字"。是否有识别日期或时间戳的等效功能?
答案 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
以查看有多少格式选项。