"-d"/"--date=" オプションで "date" を使用する

"-d"/"--date=" オプションで "date" を使用する

date私はこれを使ってRaspberry Piのリアルタイムクロックの将来の「アラーム時間」を計算したいと思います。これらの「アラーム時間」は、RPiを「目覚めさせる」ために使用されます。

私が使用することを決めた解決策は次のとおりです。

  1. 開始直後、私が選択した形式で現在の「基準」時間が表示されます。

    $ BASETIME=$(date "+%D %X")
    $ echo $BASETIME
    05/03/21 14:03:43
    
  2. 以前は、shutdown「基準」時間から1つ以上の「覚醒アラーム時間」を計算する必要がありました(例:BASETIMEでは6時間)。私が理解している限り、-dor--date=オプションはこの目的に使用されますが、正しい結果は得られません。

    $ date '+%D %X' -d "${BASETIME} + 6 hours"
    05/03/21 04:03:43
    

    結果は終わりました! ?- これは明らかに間違っています(少なくとも私が望むものではありません)man date

    日付文字列の形式は、ここで簡単に説明されているよりも複雑です。

    そして

    文書全体 [...] は、以下を介してローカルに提供されます。info '(coreutils) date invocation'

    しかし、ここでも有用なものが見つかりませんでした。

    近い選択肢は次のとおりです。

    $ date "+%D %X" -d '+ 6 hours'
    05/03/21 10:10:11
    

    これにより、正確なアラーム時間がわかります。しかし、これはBASETIMEではなく現在時刻に基づいています。

私の質問は次のとおりです

  • なぜdate '+%D %X' -d "${BASETIME} + 6 hours" 削減代わりに時間増加時間?

  • 固定BASETIMEで増やす正しい方法は何ですか?

注:FWIW、私のOS、カーネル、dateバージョン:

$ date --version
date (GNU coreutils) 8.30
...

$ hostnamectl
...
Operating System: Raspbian GNU/Linux 10 (buster)
          Kernel: Linux 5.10.17-v7+
...

答え1

主な問題は、生成された日付文字列にBASETIME=$(date "+%D %X")タイムゾーンが含まれていないことです。使用するとBASETIME=$(date "+%D %X %z")問題が解決します。

date '+%D %X' -d "${basetime} + 6 hours"+ 6(または+6など)の場合、+06タイムゾーンの値として解釈されます。

あなたはそれを見ることができます牛に似た一種の栄養 date --debugオプション(太い鉱山):

$ date '+%D %X %z' -d "${basetime} + 6 hours" --debug
date: warning: value 5 has less than 4 digits. Assuming MM/DD/YY[YY]
date: parsed date part: (Y-M-D) 0021-05-03
date: **parsed time part: 14:03:43 UTC+06**
date: parsed relative part: +1 hour(s)
date: input timezone: parsed date/time string (+06)
date: warning: adjusting year value 21 to 2021
date: using specified time as starting value: '14:03:43'
date: starting date/time: '(Y-M-D) 2021-05-03 14:03:43 TZ=+06'
date: '(Y-M-D) 2021-05-03 14:03:43 TZ=+06' = 1620029023 epoch-seconds
date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns),
date:     new time = 1620032623 epoch-seconds
date: timezone: system default
date: final: 1620032623.000000000 (epoch-seconds)
date: final: (Y-M-D) 2021-05-03 09:03:43 (UTC)
date: final: (Y-M-D) 2021-05-03 05:03:43 (UTC-04)
05/03/21 05:03:43 AM -0400

また、時間という単語は「1時間追加」と解釈されます。

TimeZone値を使用して時間を表現すると、すべての問題が解決されます。次の形式を
使用することをお勧めします。%F %T %z

$ basetime=$(date "+%F %T %z"); echo "$basetime"
2021-05-03 18:31:43 -0400

$ date '+%F %T %z' -d "${basetime} + 6 hours"
2021-05-04 00:31:43 -0400

これがまさに未来です。 「--debug」オプションを使用して引き続き実行できます。

タイムゾーン(推奨しない)を回避する解決策は、+6 hours静的時間値の前に相対用語()を入れることです。

$ date -d "+6 hours 2021-05-03 18:31:43"
Tue 04 May 2021 12:31:43 AM EDT

答え2

まだこの記録を見つけることができませんでしたが、いたずらdateに文字列を割り当てるときに使用する書式順のようですBASETIME。つまり、逆注文する%D/オプションで計算を実行して、正しい%X(必要な)結果を生成します。-d--date=

$ BASETIME=$(date "+%X %D")
$ echo $BASETIME
15:00:28 05/03/21

$ date '+%D %X' -d "${BASETIME} + 6 hours"
05/03/21 21:00:28 
# note that the output format need not be the same as the `BASETIME` format

$ date '+%D %X' -d "${BASETIME} + 24 hours"
05/04/21 15:00:28 
# note that the date advances correctly 

$ date '+%D %X' -d "${BASETIME} + 15 minutes"
05/03/21 15:15:28

$ date '+%D %X' -d "${BASETIME} + 6 months"
11/03/21 15:00:28

$ date '+%D %X' -d "${BASETIME} + 26 weeks"
11/01/21 15:00:28

メモ:

時間をかけて質問をした後、この回答を見つけました。誰かに役立つことを願ってここに投稿します。

関連情報