![busybox 中的日期命令不接受格式化的输入日期](https://linux22.com/image/146277/busybox%20%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E5%91%BD%E4%BB%A4%E4%B8%8D%E6%8E%A5%E5%8F%97%E6%A0%BC%E5%BC%8F%E5%8C%96%E7%9A%84%E8%BE%93%E5%85%A5%E6%97%A5%E6%9C%9F.png)
date
我想使用 busybox 的命令(BusyBox v1.21.0)设置日期。我想要将计算机设置为的自定义日期采用以下形式:
Tue, 15 Jan 2019 10:46:13 GMT
我的date
命令能够使用以下字符串以相同的格式打印日期:
date +"%a, %d %b %Y %T %Z"
它以与上面完全相同的格式返回日期。但当我使用-s
选项设置日期时,它不会接受这一点。
例如,这会失败:
date -u +"%a, %d %b %Y %T %Z" -s "Wed, 17 Feb 2010 19:14:32 UTC"
date: invalid date 'Wed, 17 Feb 2010 19:14:32 UTC'
我知道 busybox 命令的功能有所减少,但我想象当它可以处理格式字符串以所需的形式打印当前日期时,它也应该能够使用它来解释输入字符串。
答案1
busyboxdate
只接受非常特定的时间格式,而不是任意的时间格式。
$ busybox date --help
[...]
[-s,--set] TIME Set time to TIME
[...]
Recognized TIME formats:
hh:mm[:ss]
[YYYY.]MM.DD-hh:mm[:ss]
YYYY-MM-DD hh:mm[:ss]
[[[[[YY]YY]MM]DD]hh]mm[.ss]
'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead
所以你只需要这样写date -s 2010.02.17-19:14:32
(或任何你喜欢的格式)。
答案2
您可以让 busybox date 为您进行格式转换,用于-D
指定输入格式,以及通常的+...
输出格式,并-d
提供参考日期和时间。例如,
r='Tue, 15 Jan 2019 09:16:53 GMT'
d=$(busybox date -d "$r" -D "%a, %d %b %Y %T %Z" +'%Y-%m-%d %H:%M:%S')
# d becomes 2019-01-15 09:01:53
busybox date -s "$d"
答案3
busybox 日期的某些版本接受自定义格式作为使用-D
选项的输入。然而,在花了一个小时之后,这个选项不支持时区格式%Z
。
C 所有支持的格式列表strftime
:C 库函数 - strftime()
注意:需要+
从输出格式的开头删除 ,才能用作输入格式-D
。例如"+%FT%T%z"
变成-D "%FT%T%z"
。
一般工作转换
## Date context for other commands
# date -Iminutes
2021-04-01T13:30+0000
# date -u -D '%b %e %Y' -d "Apr 1 2021"
Thu Apr 1 00:00:00 UTC 2021
# date -u -d "2021 04xx25" -D '%Y %mxx%d'
Sun Apr 25 00:00:00 UTC 2021
# date -u -d "5 12:35:58" -D "%e %H:%M:%S"
Mon Apr 5 12:35:58 UTC 2021
随着时区
## Format returned by `openssl x509 -enddate`
# date -u +"%b %e %H:%M:%S %Y %Z"
Apr 1 13:33:58 2021 UTC
# # date -u -D "%b %e %H:%M:%S %Y %Z" -d "Apr 1 13:33:58 2021 UTC"
date: invalid date 'Apr 1 13:33:58 2021 UTC'
## removing the %Z timezone from the input:
# date -u -D "%b %e %H:%M:%S %Y" -d "Apr 1 13:33:58 2021 UTC"
Thu Apr 1 13:33:58 UTC 2021
## yet providing %Z in output format works well
# date -u -D "%b %e %H:%M:%S %Y" -d "Apr 1 13:33:58 2021 UTC" +"%F %T %Z"
2021-04-01 13:33:58 UTC
Busybox 版本和日期帮助
运行 alpine linux 的容器busybox
v1.32.1
# uname -a
Linux f4d750b1edf8 4.19.121-linuxkit #1 SMP Thu Jan 21 15:36:34 UTC 2021 x86_64 Linux
# busybox date --help
BusyBox v1.32.1 () multi-call binary.
Usage: date [OPTIONS] [+FMT] [TIME]
Display time (using +FMT), or set time
[-s,--set] TIME Set time to TIME
-u,--utc Work in UTC (don't convert to local time)
-R,--rfc-2822 Output RFC-2822 compliant date string
-I[SPEC] Output ISO-8601 compliant date string
SPEC='date' (default) for date only,
'hours', 'minutes', or 'seconds' for date and
time to the indicated precision
-r,--reference FILE Display last modification time of FILE
-d,--date TIME Display TIME, not 'now'
-D FMT Use FMT (strptime format) for -d TIME conversion
Recognized TIME formats:
hh:mm[:ss]
[YYYY.]MM.DD-hh:mm[:ss]
YYYY-MM-DD hh:mm[:ss]
[[[[[YY]YY]MM]DD]hh]mm[.ss]
'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead
答案4
在通过 netinstall 安装 Debian 11.2 时,我遇到了一个问题,因为系统日期比实际日期早 45 天。我需要通过以下命令更新日期
date +"2021-12-20 12:37:00"
,由于 busybox 的原因,它与通常的日期命令有点不同