我想使用date为我的Raspberry Pi上的实时时钟计算一些未来的“警报时间”。这些“警报时间”将用于“唤醒”RPi。
我决定采用的计划如下:
shutdown之前,我需要从“基线”时间计算至少一个“唤醒警报时间”;例如,从BASETIME计算6个小时。据我所知,-d或--date=选项是用于此目的的,但我没有得到正确的结果:$ date '+%D %X‘-d "${BASETIME} +6小时“05/03/21 04:03:43 The结果是过去的一段时间!?-这显然是不正确的(至少不是我想要的:)对man date的彻底阅读没有光线;它表明:日期字符串格式比这里容易记录的要复杂……以及通过:info '(coreutils) date invocation'在本地获得的完整文档,但我在这里也没有发现任何有用的东西。接近的另一种选择是:$ date "+%D %X“-d '+ 6小时‘05/03/21 10:10:11 -我可以以这种方式获得正确的警报时间,但这是相对于当前时间的,而不是BASETIME。date '+%D %X' -d "${BASETIME} + 6 hours" 减少时间而不是增量时间?date版本:$ date --version
date (GNU coreutils) 8.30
...
$ hostnamectl
...
Operating System: Raspbian GNU/Linux 10 (buster)
Kernel: Linux 5.10.17-v7+
...发布于 2021-05-03 22:41:02
核心问题是在BASETIME=$(date "+%D %X")中创建的日期字符串不包括Timezone。使用BASETIME=$(date "+%D %X %z")可以解决你的问题。
使用date '+%D %X' -d "${basetime} + 6 hours"、+ 6 (或+6或+06等)被解释为时区值。
您可以使用<>GNU date --debug选项(粗体D7)看到它:
$ 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这确实是未来的事。它仍然可以使用`-调试选项执行。
避免时区(我不建议这样做)的解决办法是将相对项(+6 hours)放在静态时间值之前:
$ date -d "+6 hours 2021-05-03 18:31:43"
Tue 04 May 2021 12:31:43 AM EDT发布于 2021-05-03 20:32:39
我还没有找到这个文档,但是技巧似乎是按照将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我花了很长时间才找到这个问题的答案。我把它张贴在这里,希望它可以帮助其他人。
https://unix.stackexchange.com/questions/647917
复制相似问题