我试图解析出 的日期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
为)。%F
strftime()
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