Конвертировать Old Unix Date в Perl и сравнить - PullRequest
2 голосов
/ 27 февраля 2012

Требование - У меня есть имя файла с именем "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);

Но проблема здесь в том, что я не получаю решение о том, как извлечь 2 цифры из $1 и назначить$sec, $min и т. Д. Любая помощь?

Кроме того, если у вас есть хороший подход к решению этой проблемы, пожалуйста, поделитесь со мной

Ответы [ 5 ]

7 голосов
/ 27 февраля 2012

Мне нравится использовать объекты времени для упрощения логики.Я использую 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";
}
5 голосов
/ 27 февраля 2012

Можно также научить 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';
};
3 голосов
/ 27 февраля 2012
my ($year, $month, $day, $hour, $min) = $file =~ /(\d{2})/g;

if ($min) {
    $year += 100; # Assuming 2012 and not 1912
    $month--;
    # Do stuff
}
2 голосов
/ 27 февраля 2012

Использование модуля для анализа дат может быть полезным.Этот код проанализирует дату и вернет объект DateTime .Обратитесь к документации , чтобы увидеть множество способов манипулирования этим объектом.

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);
}
2 голосов
/ 27 февраля 2012

Я думаю, 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 );
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...