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:26Z
是zulu 时间(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
为/支持它的系统)。%F
strftime()
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
.)
这些当然只是简单的子字符串操作。如果您想实际解析日期,则必须执行其他操作。由于格式是固定宽度的,因此子字符串扩展当然很适合这里。但是您可能想检查这些值是否有效等。
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 的最短匹配项。操作字符串中的更多详细信息
所以只要找到所有的数字-破折号-破折号-数字?即使在日期之后没有任何“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)