如何在 bash 中将自 2001 年 1 月 1 日 00:00 以来经过的秒数转换为人类可读的日期?

Dis*_*ame 4 bash date

例如在 swift 你会这样做:

let date = Date(timeIntervalSinceReferenceDate: 500000)
print(date) 
Run Code Online (Sandbox Code Playgroud)

要得到:

2001-01-06 18:53:20 +0000
Run Code Online (Sandbox Code Playgroud)

A.B*_*A.B 5

由于 Unix 的 Epoch 是 1970-01-01 00:00:00 UTC 而不是 2001-01-01 00:00:00 UTC,可用的工具,如 gnu date 命令,必须只提供两者之间的秒数使用其内置转换功能给出结果的实际数据。

$ seconds=500000
$ TZ=UTC date --iso-8601=s -d @$(( $(date +%s -d '2001-01-01T00:00:00+00') + $seconds ))
2001-01-06T18:53:20+00:00
Run Code Online (Sandbox Code Playgroud)

更新:(感谢@Kusalananda 的评论)实际上甚至不需要提及 Unix Epoch,因为 GNU date 命令接受直接向给定日期添加时间偏移量。它必须只提供正确的单位后缀(此处seconds)。这使得命令更简单、更通用且更易于阅读:

$ seconds=500000
$ TZ=UTC date --iso-8601=s -d "2001-01-01T00:00:00+00 + $seconds seconds"
2001-01-06T18:53:20+00:00
Run Code Online (Sandbox Code Playgroud)

要完全像 OP 的输出格式一样输出,请替换--iso-8601=s'+%F %T %z'

上面的命令使用这些选项和参数:

  • -d: 使用给定日期而不是当前日期。可以包括添加时间偏移。
  • --iso-8601=s是类似于(给予或占用一些空格等)的 ISO 格式+%F %T %z,它与以下内容相同+Y-%m-%d %H:%M:%S %z:不言自明,其中 %z 是 UTC 的时区偏移量,由于TZ=UTC强制它,这里将是 +0000 。

  • 你应该可以用 GNU date 说 `date --iso-8601=s -d "2001-01-01T00:00:00+00 +$seconds seconds"` ,这样可以避免调用 `date` 两次,也避免了贝壳算术杂耍。 (2认同)