date
私はこれを使ってRaspberry Piのリアルタイムクロックの将来の「アラーム時間」を計算したいと思います。これらの「アラーム時間」は、RPiを「目覚めさせる」ために使用されます。
私が使用することを決めた解決策は次のとおりです。
開始直後、私が選択した形式で現在の「基準」時間が表示されます。
$ BASETIME=$(date "+%D %X") $ echo $BASETIME 05/03/21 14:03:43
以前は、
shutdown
「基準」時間から1つ以上の「覚醒アラーム時間」を計算する必要がありました(例:BASETIMEでは6時間)。私が理解している限り、-d
or--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
メモ:
時間をかけて質問をした後、この回答を見つけました。誰かに役立つことを願ってここに投稿します。