解析日期模式

Parse Date Pattern

我正在尝试使用 awk 将日期转换为特定格式,以下是我尝试过的命令。

$ echo | awk -v Date=`date -d '2019-10-07'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T00:00:00
$ echo | awk -v Date=`date -d '2019-10-07T'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T01:00:00
$ echo | awk -v Date=`date -d '2019-10-07D'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T12:00:00
$ echo | awk -v Date=`date -d '2019-10-07S'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T02:00:00
$ echo | awk -v Date=`date -d '2019-10-07U'  '+%Y-%m-%dT%H:%M:%S'` '{print Date}'
2019-10-07T00:00:00

这里,不明白为什么日期"2019-10-07T"returns"2019-10-07T01:00:00""2019-10-07S"returns"2019-10-07T02:00:00"

我试图弄明白T、S、你等的意思,但是没找到。

能请教一下吗?

可能在 awk 中使用这样的东西会更聪明

print strftime("Time = %m/%d/%Y %H:%M:%S", systime())

对于您最初的问题,您可能可以阅读 this

遗憾的是,您完全不可能围绕定义命令 date 可以处理的几乎无限多的 date-input formats 的逻辑思考。然而,令人印象深刻的是,他们能够做到如此出色!尤其是当您意识到人类想出了过多的日期时间格式时。

您发现的是一种叫做 military timezones 的东西,它是另一种书写日期时间的形式,但是是一种有组织的形式。因此,当您要求 date 转换“2019-10-07S”时,它将采用 Sierra 时区 (UTC-6) 中的“2019-10-07T00:00:00”。因此,您的结果应该是“2019-10-06T18:00:00 UTC”。但是,您收到的“2019-10-07T02:00:00”并不相同。那是因为 date returns 您当地时区的格式字符串,它告诉我您当前的系统设置为 UTC+8。

我们可以将其验证为:

$ TZ="Australia/Perth" date -d "2019-10-07S" "+%FT%T %z %Z"
2019-10-07T02:00:00 +0800 AWST
$ TZ="UTC-8" date -d "2019-10-07S" "+%FT%T %z %Z"
2019-10-07T02:00:00 +0800 UTC

注:注意TZ="UTC-8"实际上是指UTC+8。此表示法被解释为 Posix 时区。 (参见:U&L: Why does TZ=UTC-8 produce dates that are UTC+8?