【发布时间】:2021-10-23 16:28:44
【问题描述】:
如何通过 bash 脚本验证我的日期时间字符串是否具有带时区 (+0200) 的有效 ISO-8601 格式?
可接受的格式只有%Y-%m-%dT%H:%M:%S+0200。
编辑: 我可以将年份设置为 0001、9999 或任何 4 位数字的随机排列。我只需要强制执行语法检查。
【问题讨论】:
如何通过 bash 脚本验证我的日期时间字符串是否具有带时区 (+0200) 的有效 ISO-8601 格式?
可接受的格式只有%Y-%m-%dT%H:%M:%S+0200。
编辑: 我可以将年份设置为 0001、9999 或任何 4 位数字的随机排列。我只需要强制执行语法检查。
【问题讨论】:
这是一个简单的 bash 脚本,它针对 extended(非基本/缩短)ISO-8601 格式的正则表达式测试给定参数,该格式在问题之后要求所有字段都存在:
#!/bin/bash
if [[ $1 =~ ^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}T?[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}([\.,][[:digit:]]+)?\+0200$ ]]
then
echo correct format
else
echo incorrect format
fi
Wikipedia's article on ISO-8601 表示该格式允许省略日期字段,但上述正则表达式需要它,遵循问题的示例。正则表达式允许 T 是可选的,遵循 Wikipedia 文章。我添加了对小数秒的可选支持(([\.,][[:digit:]]+)? 部分),同样基于 Wikipedia 文章。
正则表达式不会对值进行任何范围检查。
【讨论】:
这是一个不使用任何正则表达式并使用 gnu-date 的日期解析的解决方案:
s='2021-08-23T12:10:35+200'
[[ $s == *'+200' && $(TZ=CET date -d "$s" '+%FT%T' 2>/dev/null) == "${s%+*}" ]] &&
echo 'ok' || echo 'nope'
【讨论】:
如果您希望针对任何时区验证您的 ISO 日期,包括格式
1970-01-01T00:00:00Z
1970-01-01T00:00:00+0200
然后你可以使用这个正则表达式:
[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|\+[0-9]{4})$
#!/bin/bash
if [[ $1 =~ [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|\+[0-9]{4})$ ]]
then
echo "ISO date";
else
echo "Malformed date";
fi
[[ ]] 不符合 POSIX,这限制了它的可移植性。【讨论】: