将旧的Unix日期转换为Perl并进行比较

时间:2012-02-27 12:28:30

标签: perl shell date time

要求 - 我的文件名称为“Rajesh.1202242219”。数字只是日期“date '+%y''%m''%d''%H''%M'”格式。 现在我正在尝试编写一个perl脚本来从文件名中提取数字并与当前系统日期和时间进行比较,并根据此比较的输出,使用perl打印一些值。

方法

从文件名中提取数字:

if ($file =~ /Rajesh.(\d+).*/) {
print $1;
        }

将此时间转换为perl中的可读时间

my $sec  =  0;  # Not Feeded
my $min  =  19;
my $hour =  22;
my $day  =  24;
my $mon  = 02   - 1;
my $year = 2012 - 1900;
my $wday = 0;   # Not Feeded
my $yday = 0;   # Not Feeded

my $unixtime = mktime ($sec, $min, $hour, $day, $mon, $year, $wday, $yday);
print "$unixtime\n";
my $readable_time = localtime($unixtime);
print "$readable_time\n";

查找当前时间并进行比较......

my $CurrentTime = time();
my $Todaydate = localtime($startTime);

但问题是,我没有获得如何从$1中提取2位数并分配到$sec$min等的解决方案。任何帮助?

此外,如果您对此问题声明有好的方法,请与我分享

5 个答案:

答案 0 :(得分:7)

我喜欢使用时间对象来简化逻辑。我在这里使用Time::Piece因为它简单而且重量轻(并且是核心的一部分)。 DateTime可以是另一种选择。

use Time::Piece;
my ( $datetime ) = $file =~ /(\d+)/;
my $t1 = Time::Piece->strptime( $datetime, '%y%m%d%H%M' );
my $t2 = localtime(); # equivalent to Time::Piece->new

# you can do date comparisons on the object
if ($t1 < $t2) {
    # do something
    print "[$t1] < [$t2]\n";
}

答案 1 :(得分:5)

不妨教DateTime ::Format::Strptime使比较更加简单:

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

if (
    DateTime::Format::Strptime
        ->new(pattern => '%y%m%d%H%M')
        ->parse_datetime('Rajesh.1202242219')
    < DateTime->now
) {
    say 'filename timestamp is earlier than now';
} else {
    say 'filename timestamp is later than now';
};

答案 2 :(得分:3)

my ($year, $month, $day, $hour, $min) = $file =~ /(\d{2})/g;

if ($min) {
    $year += 100; # Assuming 2012 and not 1912
    $month--;
    # Do stuff
}

答案 3 :(得分:2)

我认为unpack可能更合适。

if ( my ( $num ) = $file =~ /Rajesh.(\d+).*/ ) {
    my ( $year, $mon, $day, $hour, $min ) = unpack( 'A2 A2 A2 A2 A2', $num ); 
    my $ts = POSIX::mktime( 0, $min, $hour, $day, $mon - 1, $year + 100 );
    ...
}

答案 4 :(得分:2)

使用分析日期的模块可能会很好。此代码将解析日期并返回DateTime对象。请参阅documentation以了解操作此对象的多种方法。

use DateTime::Format::Strptime;

my $date = "1202242219";
my $dt = get_obj($date);

sub get_obj {
    my $date = shift;
    my $strp = DateTime::Format::Strptime->new(
        pattern     => '%y%m%d%H%M'
    );
    return $strp->parse_datetime($date);
}