有没有办法使用一年中的某一天作为 date 命令的输入格式?

Bre*_*nan 11 linux date

使用命令

$ date +%j
Run Code Online (Sandbox Code Playgroud)

给出一年中某一天的输出 (001-366)。但是我需要使用当前年份的日期作为输入格式,即

$ date --date='066 day'  +%F
Run Code Online (Sandbox Code Playgroud)

对于 2021 年,我希望将其2021-03-07作为输出。相反,我得到2021-05-13. 有谁知道发生了什么,以及是否有办法获得我想要的使用date.

Kus*_*nda 19

要使用 GNU 获得一年中的第 66 天date

$ date --date='jan 1 + 65 days' +%F
2021-03-07
Run Code Online (Sandbox Code Playgroud)

或者

$ date --date='dec 31 last year + 66 days' +%F
2021-03-07
Run Code Online (Sandbox Code Playgroud)

随着date --date='066 day' +%F你得到的日期从今天66天。3 月 8 日,这恰好是 5 月 13 日。


以上使用 GNU date。在 OpenBSD 上(不是您问的,但无论如何),您可以执行以下操作:

$ date -u -r "$(( $(date -ju -f %m%d 0101 +%s) + 65*86400 ))" +%F
2021-03-07
Run Code Online (Sandbox Code Playgroud)

这有点类似于date上面的第一个 GNU命令,因为它从 1 月 1 日开始增加了一些时间。

  • 我认为 OpenBSD 代码在具有夏令时的南半球时区是错误的:它跳过了 DST 切换的那一天,因为在那天开始后 86400 秒,它仍然是同一天的 23:00。`+ $n days` 与 GNU 日期以日历天计算,所以它的问题更加微妙:它不能正确处理跳天,例如 [Tokelau](https://en.wikipedia.org/wiki/Tokelau# Time_zone): `TZ=Pacific/Fakaofo date -d '28 December 2011 + 2 days'` → Dec 31. 修复很简单:总是使用 `TZ=UTC0` 进行日期计算。@布伦南 (4认同)

sch*_*ity 5

我提出这个选项:例如,如果您想知道第 80 天的日期:

# take the number of day today
$ n=$(date +%j)
# set some number of days you want to know the date
$ t=80
# subtract the 'n', and add the 't'
$ date -d "-$n day +$t day" %F
2021-03-21
Run Code Online (Sandbox Code Playgroud)

适应您的示例:

$ n=$(date +%j)
$ t=66
$ date -d "-$n day +$t day" %F
2021-03-07
Run Code Online (Sandbox Code Playgroud)

  • `+ $n days` 与 GNU 日期以日历日计算,因此它主要避免了 DST 问题,但它不能正确处理跳日,例如 [Tokelau](https://en.wikipedia.org/wiki/Tokelau# Time_zone):`TZ=Pacific/Fakaofo date -d '28 December 2011 + 2 days'`。修复很简单:始终使用`TZ=UTC0` 进行日期计算。 (4认同)