異なる形式の2つの日付の比較[閉じる]

異なる形式の2つの日付の比較[閉じる]

次のように、異なる日付形式を含む2つのファイルがあります。

ファイル1:

2014-NOV-0620:59:59

ファイル2:

2014-12-31

これら2つの日付をawkで比較するには?

答え1

Perlは本当に便利です。

use Time::Piece;

my $date1 = "2014-NOV-0620:59:59";
my $date2 = "2014-12-31";

my $datetime1 = Time::Piece->strptime($date1, "%Y-%b-%d%H:%M:%S");
my $datetime2 = Time::Piece->strptime($date2, "%Y-%m-%d");

if ($datetime1 < $datetime2) {
    print "$date1 is earlier than $date2\n";
}
elsif ($datetime1 > $datetime2) {
    print "$date1 is later than $date2\n";
}
else {
    print "$date1 is equal to $date2\n";
}

GNU awk:

gawk '
    function parse_date_fmt_1(date,     epoch, regex, month) {
        regex = "([[:digit:]]{4})-([[:alpha:]]{3})-([[:digit:]]{2})([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})"
        if (match(date, regex, m)) {
            month = index("..JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC", toupper(m[2])) / 3
            epoch = mktime(m[1] " " month " " m[3] " " m[4] " " m[5] " " m[6])
        }
        return epoch
    }

    function parse_date_fmt_2(date,     epoch, regex) {
        regex = "([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})"
        if (match(date, regex, m)) {
            epoch = mktime(m[1] " " m[2] " " m[3] " 0 0 0")
        }
        return epoch
    }

    BEGIN { 
        date1 = "2014-NOV-0620:59:59"
        print parse_date_fmt_1(date1)

        date2 = "2014-12-31"
        print parse_date_fmt_2(date2)
    }
'

答え2

日付と比較するために特定の日付/時刻を指定することは問題があります。指定日時は何時ですか?今日の最初の瞬間(真夜中)を想定します。一般的なアイデアは、UNIX時代以降の秒数を生成することであるため、比較が簡単です。

d2=$( date -d "2014-12-31" "+%s" )
echo $d2
1420009200

#date cmd requires day-month-year order (if month is alpha) and proper case
fixed_date=$( echo $a | awk '{a=substr($0,0,11);b=substr($0,12,19);printf("%11s %8s\n",a,b)}' | awk '{a=tolower($0);print a}' | sed 's/[[:alpha:]]/\u&/' | awk 'BEGIN{FS="[- ]"};{print $3"-"$2"-"$1,$4}' )

d1=$( date -d "$fixed_date" "+%s" )
echo $d1
1415332799

#compare to confirm the time between dates
echo "($d2-$d1)/60/60/24" | bc -l
54.125...

#example - convert seconds back to a date
date -d @$d2 +"%Y-%m-%d %H:%M:%S"
2014-12-31 00:00:00

関連情報