Perlプログラムには、次の形式の日付/時刻を含む変数があります。
Feb 3 12:03:20
深夜に発生した場合でも、その日付がx秒(現在の時刻に基づく)より古いかどうかを判断する必要があります(例:Feb 3 23:59:00
現在の時刻= Feb 4 00:00:30
)。
私が見つけたPerlの日付/時刻情報は気が遠くなるようなものです。 Date :: Calc を使用する必要があることがわかりますが、秒デルタが見つかりません。ありがとう:)
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";
これを実際に本番環境に対応させるには、年の処理(たとえば、開始日が12月で終了日が1月の場合はどうなるか)とエラー処理(たとえば、3文字の場合はどうなるか)が必要です。月の省略形のつづりが間違っていますか?)。
#!/usr/bin/Perl
$Start = time();
sleep 3;
$End = time();
$Diff = $End - $Start;
print "Start ".$Start."\n";
print "End ".$End."\n";
print "Diff ".$Diff."\n";
これは、秒単位の時差を見つける簡単な方法です。
便利な Date :: Parse があるようです。次に例を示します。
use Date::Parse;
print str2time ('Feb 3 12:03:20') . "\n";
そして、これが出力するものです:
$ Perl test.pl
1328288600
これは:Fri Feb 3 12:03:20 EST 2012
解析がどれほど適切かはわかりませんが、例は問題なく解析されます:)
TMTOWTDIの精神で、コアを活用できます Time :: Piece :
#!/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";
$./mydelta2月3日12:03:20
delta seconds = 14553
現在の年が想定され、現地時間から取得されます。
Date :: Calc を使用すると仮定して、2つの値をDate_to_Time
で「時間」値に変換し、値を減算して秒単位の差を取得します。ただし、これを行うには、最初に文字列からYY MM DD hh mm ss
値に変換して、Date_to_Time
に渡す必要があります。