簡體   English   中英

如何比較perl中的字符串日期時間?

[英]How to compare string date time in perl?

我在字符串“11:56:41,11 / 22/2011”中有這個日期時間格式。

這就是我想要的:

比較兩個日期時間字符串,如。

$date1 = "11:56:41, 11/22/2011";
$date2 = "11:20:41, 11/20/2011";
if($date2 < $date1) {
    do something...
} else {
    do nothing...
}

任何想法我怎么能在perl中實現這一點?

在將Time::Piece轉換為Time::Piece對象之后使用重載比較的另一個解決方案。 創建對象可能對於簡單的事情來說是過度的,但如果您需要與時間做其他事情,它們會變得非常有用。

use Time::Piece;

my $dateformat = "%H:%M:%S, %m/%d/%Y";

my $date1 = "11:56:41, 11/22/2011";
my $date2 = "11:20:41, 11/20/2011";

$date1 = Time::Piece->strptime($date1, $dateformat);
$date2 = Time::Piece->strptime($date2, $dateformat);

if ($date2 < $date1) {
    do something...
} else {
    do nothing...
}

一種有效的方法是將字段重新排序為詞法上可比較的字符。

sub to_comparable {
   my ($date) = @_;
   my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2}), ([0-9]{2})/([0-9]{2})/([0-9]{4})\z}
      or die;
   return "$Y$m$d$H$M$S";
}

if (to_comparable($date2) lt to_comparable($date1)) {
   ...
} else {
   ...
}

什么,已經4小時而不是單一的DateTime (所有人都歡呼強大的DateTime )回答了什么? 你是懶散的, 用戶......☻

use DateTime::Format::Strptime qw();
my $p = DateTime::Format::Strptime->new(pattern => '%T, %D', on_error => 'croak',);

my $date1 = $p->parse_datetime('11:56:41, 11/22/2011');
my $date2 = $p->parse_datetime('11:20:41, 11/20/2011');

if($date2 < $date1) {
    say "$date2 comes before $date1";
} else {
    say "$date2 does not come before $date1";
}

方法parse_datetime返回DateTime的實例,其比較運算符和字符串化被重載到DTRT。

我使用unixtime。 :)

我將兩次轉換為unixtime然后我只有兩個整數進行比較,所以我可以使用運算符<,==,>等

例如,如下轉換為unixtime

my $timestamp = "2014-03-25 12:33:32";  # (We assume localtime)

# 
# To split on the space character, it's best to use the regex / /
# 
my ($date, $time) = split (/ /, $timestamp);
my ($year, $mon, $mday) = split ('-', $date);
my ($hour, $min, $sec) = split (':', $time);

my $unixtime = timelocal($sec, $min, $hour, $mday, $mon-1, $year);

將日期時間(在您的情況下,這些是本地日期時間,因為它們沒有時區)轉換為ISO8601,然后您可以進行常規字符串比較。

要執行轉換,您應該從格式中提取六個組件

HH:MM:SS, mm/DD/YYYY

並將它們重新組裝成ISO 8601:

YYYY-MM-DDTHH:MM:SS

然后,正常的詞典比較將起作用。

http://codepad.org/berle9um

在這里重復:

sub my_format_to_iso8601 {
    $_[0] =~ /(\d\d):(\d\d):(\d\d), (\d\d)\/(\d\d)\/(\d\d\d\d)/;
    return "$6-$4-$5T$1:$2:$3";
}

$date1 = "11:56:41, 11/22/2011";
$date2 = "11:20:41, 11/20/2011";
$d1 = my_format_to_iso8601($date1);
$d2 = my_format_to_iso8601($date2);
print "first is $d1\n";
print "second is $d2\n";
if ($d2 < $d1) {
    print "second is earlier\n";
} else {
    print "first is earlier\n";
}

附錄

  • ikegami的Perl代碼要好得多。
  • 日期圖書館將是你的朋友; 只需指定一個格式字符串並使用庫的解析函數來獲取日期對象,然后它就可以直接進行比較。 (也就是說,指出ISO8601在設計上可以按字符串形式排序,這總是很有趣。)

在這個例子中,我總是使用Date::Calc

use Date::Calc;

my $date1 = "11:56:41, 11/22/2011";
my $date2 = "11:20:41, 11/20/2011";

my @date1arr=split /[^\d]/, $date1 if($date1 =~ m!\d{2}:\d{2}:\d{2}, \d{2}/\d{2}/\d{4}!;
my @date2arr=split /[^\d]/, $date2 if($date2 =~ m!\d{2}:\d{2}:\d{2}, \d{2}/\d{2}/\d{4}!;

my @diff = Delta_DHMS(@date1arr, @date2arr);
my $less;
foreach my $d ( @diff ) { $less = 1 if $d < 0; }

if($less) { ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM