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

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

例如,在 swift 中你会这样做:

let date = Date(timeIntervalSinceReferenceDate: 500000)
print(date) 

要得到:

2001-01-06 18:53:20 +0000

答案1

由于 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

更新:(感谢 @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

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

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

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

答案2

使用awk支持mktime()and的实现strftime()(例如mawkor GNU awk):

$ awk 'BEGIN { epoch = mktime("2001 01 01 00 00 00"); print strftime("%F %T %z", epoch + 500000) }'
2001-01-06 18:53:20 +0000

首先创建一个对应于 2001-01-01 00:00 的 UNIX 时间戳,然后添加 500000 秒,并根据strftime()格式字符串格式化并打印结果。这里的计算是在当地时间完成的。

从命令行上的参数获取秒数:

awk -v offset=500000 '
    BEGIN { epoch = mktime("2001 01 01 00 00 00")
            print strftime("%F %T %z", epoch + offset) }'

从标准输入读取秒(每行的第一个字):

awk 'BEGIN { epoch = mktime("2001 01 01 00 00 00") }
           { print strftime("%F %T %z", epoch + $1)   }'

请参阅手册以获取和函数awk的说明,并查看可用的格式字符串。mktime()strftime()man strftime

将 TZ 环境变量设置为 以便UTC以 UTC 而不是本地时间进行计算和输出:

TZ=UTC awk ...as above...

相关内容