Trong perl, luôn có nhiều cách để làm điều gì đó. Dưới đây là một trong đó chỉ sử dụng một mô-đun mà đến tiêu chuẩn với 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";
Để làm điều này thực sự sản xuất-sẵn sàng, nó cần xử lý tốt hơn trong năm (ví dụ, những gì sẽ xảy ra khi ngày bắt đầu trong tháng Mười Hai và cuối vào tháng 1?) và xử lý lỗi tốt hơn (ví dụ: điều gì sẽ xảy ra nếu viết tắt 3 tháng của từ bị viết sai chính tả?).
wow ... cách tham gia nhiều hơn tôi mong đợi ... cảm ơn –
@xivix, nó không cần thiết phức tạp cho những gì bạn muốn. [Câu trả lời của vmpstr] (http://stackoverflow.com/a/9134822/132382) là hoàn toàn khả thi ở đây. – pilcrow
Tất cả phụ thuộc vào số lượng mô-đun bạn có thể hoặc sẽ sử dụng. Xem câu trả lời bằng @vmpstr, sử dụng Date :: Parse. Nếu cài đặt mô-đun đó có thể chấp nhận được, hãy thực hiện nó. Nó có khả năng làm một công việc tốt hơn trong việc xử lý các định dạng dữ liệu khác nhau và các lỗi có thể xảy ra so với đoạn mã ngắn này. – theglauber