Разница во времени в секундах - PullRequest
11 голосов
/ 04 февраля 2012

В программе на Perl у меня есть переменная, содержащая дату / время в этом формате:

Feb 3 12:03:20  

Мне нужно определить, больше ли эта дата x секунд (на основетекущее время), даже если это происходит в полночь (например, Feb 3 23:59:00 с текущим временем = Feb 4 00:00:30).

Информация о дате / времени perl, которую я нашел, ошеломляет.Насколько я могу судить, мне нужно использовать Date :: Calc , но я не нахожу дельта секунд.Спасибо :)

Ответы [ 5 ]

20 голосов
/ 14 июня 2013
#!/usr/bin/perl

$Start = time();
sleep 3;
$End = time();
$Diff = $End - $Start;

print "Start ".$Start."\n";
print "End ".$End."\n";
print "Diff ".$Diff."\n";

Это простой способ найти разницу во времени в секундах.

9 голосов
/ 04 февраля 2012

Кажется, есть удобная Дата :: Разбор . Вот пример:

use Date::Parse;

print str2time ('Feb 3 12:03:20') . "\n";

И вот что он выводит:

$ perl test.pl
1328288600

что: Fri Feb 3 12:03:20 EST 2012

Я не уверен, насколько приличен анализ, но он отлично разбирает ваш пример:)

6 голосов
/ 04 февраля 2012

В духе TMTOWTDI вы можете использовать ядро ​​ Время :: Кусок :

#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
my $when = "@ARGV" or die "'Mon Day HH:MM:SS' expected\n";
my $year = (localtime)[5] + 1900;
my $t = Time::Piece->strptime( $year . q( ) . $when, "%Y %b %d %H:%M:%S" );
print "delta seconds = ", time() - $t->strftime("%s"),"\n";

$ ./mydelta 3 февраля 12: 03: 20

delta seconds = 14553

Текущий год принят за ваше местное время.

3 голосов
/ 04 февраля 2012

В Perl всегда есть несколько способов что-то сделать.Вот тот, который использует только модуль, который входит в стандартную комплектацию Perl:

#! perl -w

use strict;
use Time::Local;

my $d1 = "Feb 3 12:03:20";
my $d2 = "Feb 4 00:00:30";

# Your date formats don't include the year, so
# figure out some kind of default.
use constant Year => 2012;


# Convert your date strings to Unix/perl style time in seconds
# The main problems you have here are:
# * parsing the date formats
# * converting the month string to a number from 1 to 11
sub convert
{
    my $dstring = shift;

    my %m = ( 'Jan' => 0, 'Feb' => 1, 'Mar' => 2, 'Apr' => 3,
            'May' => 4, 'Jun' => 5, 'Jul' => 6, 'Aug' => 7,
            'Sep' => 8, 'Oct' => 9, 'Nov' => 10, 'Dec' => 11 );

    if ($dstring =~ /(\S+)\s+(\d+)\s+(\d{2}):(\d{2}):(\d{2})/)
    {
        my ($month, $day, $h, $m, $s) = ($1, $2, $3, $4, $5);
        my $mnumber = $m{$month}; # production code should handle errors here

        timelocal( $s, $m, $h, $day, $mnumber, Year - 1900 );
    }
    else
    {
        die "Format not recognized: ", $dstring, "\n";
    }
}

my $t1 = convert($d1);
my $t2 = convert($d2);

print "Diff (seconds) = ", $t2 - $t1, "\n";

Чтобы сделать его действительно готовым к производству, требуется лучшая обработка года (например, что происходит, когда дата начала в декабреи дата окончания в январе?) и лучшая обработка ошибок (например, что произойдет, если неправильно введена аббревиатура с 3 символами месяца?).

2 голосов
/ 04 февраля 2012

Предполагая, что вы хотите использовать Date :: Calc , преобразуйте два значения в значения "time" с помощью Date_to_Time и вычтите значения, чтобы получить разницу в секундах. Но для этого вам необходимо преобразовать строки в YY MM DD hh mm ss значения, чтобы сначала передать Date_to_Time.

...