一天开始的日期时间是否有保留字?

Lun*_*ist 6 date

man date不会向我显示任何保留字,但它们有“现在”或“今天”等。

我想知道是否有任何明确的方法来打印当天的开始(00:00:00)。

date -u -d "$(date +'%F')"在任何情况下都足够吗?看起来有点傻。

Sté*_*las 10

date -d 00:00或者date -d 00:00:00使用 GNU、ast-open、toybox 和 busybox 的date.

date -d 0也适用于 GNU date

$ date -d 00:00
Tue  4 Oct 00:00:00 BST 2022
Run Code Online (Sandbox Code Playgroud)

使用BSD date

$ date -jf %H%M%S 000000
Mon Oct  4 00:00:00 BST 2022
Run Code Online (Sandbox Code Playgroud)

-j, -f,都不是-d的标准选项date

除了设置系统时钟(在 XSI 选项下)之外, POSIXdate没有规定指定当前以外的输入日期。

你可以这样做:

$ date '+%a %e 00:00:00 %Z %Y'
Tue  4 00:00:00 BST 2022
Run Code Online (Sandbox Code Playgroud)

但是,BST如果您在时钟更改为冬季时间的那天运行该部分,则该部分最终可能会出错。

ksh93zsh具有解析输入日期的内置支持:

  • 克什93

    $ printf '%(%c [%s epoch time])T\n' 00:00
    Tue Oct  4 00:00:00 2022 [1664838000 epoch time]
    
    Run Code Online (Sandbox Code Playgroud)

    (从 ksh93bash复制%(format)T,但不能指定纪元秒以外的输入日期)。

    ksh93 也可以使用 ast-open 内置函数构建date

  • 桀骜

    $ zmodload zsh/datetime
    $ strftime -s today %F
    $ strftime -rs start %F $today
    $ strftime '%c [%s epoch time]' $start
    Tue 04 Oct 2022 00:00:00 BST [1664838000 epoch time]
    
    Run Code Online (Sandbox Code Playgroud)

    或者使用提示扩展获取今天的日期(此处通过%参数扩展标志):

    $ zmodload zsh/datetime
    $ strftime -rs start %F ${(%):-%D{%F}}
    $ strftime '%c [%s epoch time]' $start
    Tue 04 Oct 2022 00:00:00 BST [1664838000 epoch time]
    
    Run Code Online (Sandbox Code Playgroud)

请注意,您的:

date -u -d "$(date +'%F')"
Run Code Online (Sandbox Code Playgroud)

以 YYYY-MM-DD 格式获取您时区中的今天日期,但随后要求date您提供当天00:00:00 UTC的时间,除非您所在的时区当前恰好与 UTC 一致,否则不会成为一天的开始。

英国大陆仍处于夏令时(比世界标准时间早一小时):

$ date -u -d "$(date +'%F')" +%s
1664841600
$ date -d 00:00 +%s
1664838000
Run Code Online (Sandbox Code Playgroud)

  • 话虽如此, `TZ=Europe/London faketime 2022-10-30T00:01 date -d 'tomorrow 00:00:00' +%FT%T%z` 返回 `2022-10-31T00:00:00+0000` 。 (2认同)