「datetime」タイムスタンプが2つの「datetime」タイムスタンプの間にあることを確認する方法

「datetime」タイムスタンプが2つの「datetime」タイムスタンプの間にあることを確認する方法

タイムスタンプが2つのタイムスタンプの間にあるかどうかを確認するいくつかの方法を検索して見つけましたが、すべての方法方法仮定 HH:MM:SS形式のみを考慮せず、形式のみを考慮してください。日付

私の実際のシナリオは、日付とミリ秒を含む一般的な形式のログファイルの入力タイムスタンプです2019-11-11 19:05:55,823

与えられたタイムスタンプがあるとします2019-11-11 19:05:55,823。それが範囲内にあるか外にあるかをどうやって確認しますか?

2019-11-11 17:02:54,479
2019-11-12 05:13:55,998

答え1

特にbashの場合は問題になります。

start='2019-11-11 17:02:54,479'
end='2019-11-12 05:13:55,998'
date='2019-11-11 19:05:55,823'

if LC_ALL=C command eval '[[ ! $date < $start && ! $date > $end ]]'; then 
  echo the date is in the range
fi

これは語彙比較を実行します。これは、Cロケールでは、これらの日付表現が語彙と時系列で同じであるために機能します。

bash演算子は文字列を比較する[[ < / > ]]ために使用されるため、ローカライズされたソートstrcoll()アルゴリズムが使用されます。 Cロケールではstrcoll()と同じ意味ですstrcmp()。他のロケールはそのロケールの規則に従って比較されるため、結果について多くの保証を受けることはできません。

POSIXlyでは、次のものを使用できます。

if LC_ALL=C expr "x $date" '>=' "x $start" '&' "x $date" '<=' "x $end" > /dev/null; then
  echo the date is in the range
fi

awkこれでログファイルで作業している場合は、タイムスタンプが各行の先頭にあると仮定してこれを実行できます。

LC_ALL=C awk -v start='2019-11-11 17:02:54,479' \
             -v end='2019-11-12 05:13:55,998' '
   $0 >= start && $0 <= end' < file.log

この範囲のタイムスタンプで始まる行が印刷されます。

関連情報