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

dha*_*val 10 command-line bash string date

我试图从2017-03-08T19:41:26Z.

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

Sté*_*las 30

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

time=2017-03-08T19:41:26Z
utc_date=${time%T*} # as already said
Run Code Online (Sandbox Code Playgroud)

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

expr "$time" : '\(.*\)T'
Run Code Online (Sandbox Code Playgroud)

现在,请注意这2017-03-08T19:41:26Zzulu 时间(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
Run Code Online (Sandbox Code Playgroud)

(因为 GNU date 很容易识别开箱即用的 zulu 格式)

ksh93

printf '%(%F)T\n' "$time"
Run Code Online (Sandbox Code Playgroud)

使用zsh内置插件:

zmodload zsh/datetime
TZ=UTC0 strftime -rs unix_time %Y-%m-%dT%TZ $time &&
strftime %Y-%m-%d $unix_time
Run Code Online (Sandbox Code Playgroud)

(您可以在 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
Run Code Online (Sandbox Code Playgroud)


sga*_*gel 13

使用cut

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

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

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

echo "2017-03-08T19:41:26Z" | cut -d T -f 1
Run Code Online (Sandbox Code Playgroud)


ilk*_*chu 10

在 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'
Run Code Online (Sandbox Code Playgroud)

${variable%pattern}实际上是标准 shell 语言的一部分,也被更简单的 shell 支持,比如dash.)

这些当然只是简单的子字符串操作。如果您想实际解析日期,则必须执行其他操作。由于格式是固定宽度的,因此子字符串扩展当然很适合这里。但是您可能想检查这些值是否有效等。


ste*_*eve 6

Bash 变量替换可以涵盖这一点。

OLD="2017-03-08T19:41:26Z"
NEW=${OLD%T*}
echo $NEW
2017-03-08
Run Code Online (Sandbox Code Playgroud)

${string%substring} - 从 $string 后面删除 $substring 的最短匹配项。操作字符串中的更多详细信息


Xen*_*050 5

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

grep -o "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
Run Code Online (Sandbox Code Playgroud)

或等效地,但使用大括号“重复/倍数”略短

grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'
Run Code Online (Sandbox Code Playgroud)

前任:

$ echo 2017-03-08T19:41:26Z | grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'
2017-03-08
Run Code Online (Sandbox Code Playgroud)

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

$ echo 2017-03-08T19:41:26Z | grep -o '....-..-..'
2017-03-08
Run Code Online (Sandbox Code Playgroud)