首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在`-d` /`-日期=`选项中使用‘date’

在`-d` /`-日期=`选项中使用‘date’
EN

Unix & Linux用户
提问于 2021-05-03 20:32:39
回答 2查看 491关注 0票数 0

我想使用date为我的Raspberry Pi上的实时时钟计算一些未来的“警报时间”。这些“警报时间”将用于“唤醒”RPi。

我决定采用的计划如下:

  1. 启动后,我立即以我选择的格式获得当前的“基线”时间:$BASETIME=$(日期"+%D %X") $ echo $BASETIME 05/03/21 14:43
  2. 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" 减少时间而不是增量时间?
  • 从一个固定的BASETIME中增加正确的方法是什么?

注意: FWIW,my,内核和date版本:

代码语言:javascript
复制
$ date --version
date (GNU coreutils) 8.30
...

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

回答 2

Unix & Linux用户

回答已采纳

发布于 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)看到它:

代码语言:javascript
复制
$ 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作为格式:

代码语言:javascript
复制
$ 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)放在静态时间值之前:

代码语言:javascript
复制
$ date -d "+6 hours 2021-05-03 18:31:43"
Tue 04 May 2021 12:31:43 AM EDT
票数 3
EN

Unix & Linux用户

发布于 2021-05-03 20:32:39

我还没有找到这个文档,但是技巧似乎是按照将date字符串赋值给BASETIME时使用的格式顺序。换句话说,逆转%D%X顺序会导致在-d/--date=选项下执行的计算得到正确的(希望的)结果:

代码语言:javascript
复制
$ 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

注:

我花了很长时间才找到这个问题的答案。我把它张贴在这里,希望它可以帮助其他人。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/647917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档