如何解析 2017-03-08T19:41:26Z 中的日期?

如何解析 2017-03-08T19:41:26Z 中的日期?

我试图解析出 的日期2017-03-08T19:41:26Z

所需的输出是 2017-03-08。

答案1

要使用 POSIX shell 提取 之前的部分T

time=2017-03-08T19:41:26Z
utc_date=${time%T*} # as already said

或者与 Bourne 兼容或用于非 POSIX shell:

expr "$time" : '\(.*\)T'

现在,请注意,这2017-03-08T19:41:26Z祖鲁时间(UTC 的另一个名称),精确时刻的明确规范。

当时,伦敦的日期是2017-03-08,但曼谷的日期是2017-03-09(凌晨)。

如果您想了解当地的该时间规范的日期(而不是 UTC 日期),即曼谷用户获取 2017-03-09,伦敦用户获取 2017-03-08,有几个选项。

使用 GNU date

time=2017-03-08T19:41:26Z

date -d "$time" +%F

(非常简单,因为 GNU date 可以识别 zulu 格式)

ksh93与:相同

printf '%(%F)T\n' "$time"

具有zsh内置功能:

zmodload zsh/datetime
TZ=UTC0 strftime -rs unix_time %Y-%m-%dT%TZ $time &&
strftime %Y-%m-%d $unix_time

(您可以在支持它的系统(例如 GNU 系统)上替换%Y-%m-%d为)。%Fstrftime()strptime()

与......类似busybox date

unix_time=$(date -u -D %Y-%m-%dT%TZ -d "$time" +%s)
date -d "@$unix_time" +%Y-%m-%d

答案2

使用cut

cut - 从文件的每一行中删除部分

-d, --delimiter=DELIM 使用 DELIM 而不是 TAB 作为字段分隔符

-f, --fields=LIST 仅选择这些字段;还打印任何不包含分隔符的行,除非指定了 -s 选项

echo "2017-03-08T19:41:26Z" | cut -d T -f 1

答案3

在 Bash 中,您可以在参数扩展变量的:

timestamp='2017-03-08T19:41:26Z'
date=${timestamp:0:10}          # pick 10 characters starting at position 0
date=${timestamp%T*}            # remove everything starting at the 'T'

${variable%pattern}实际上是标准 shell 语言的一部分,并且也受到更简单的 shell(如 )的支持dash。)

这些当然只是简单的子串操作。如果你真的想解析到了这个日期,你就得做点别的事了。子字符串扩展当然非常适合这里,因为格式是固定宽度的。但您可能想检查这些值是否有效等。

答案4

那么只要找到所有的数字-破折号-数字-破折号-数字就可以了吗?这适用于较长的字符串/行,即使在日期之后没有任何“T”。

grep -o "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]"

或者等效地,但使用大括号“重复/多次”稍微短一些

grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'

前任:

$ echo 2017-03-08T19:41:26Z | grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'
2017-03-08

如果输入中没有太多其他破折号,您可以搜索任意 4 个字符、一个破折号、两个字符、一个破折号、另外两个字符:

$ echo 2017-03-08T19:41:26Z | grep -o '....-..-..'
2017-03-08

相关内容