【问题标题】:Check if the date format is in ISO 8601 in bash检查日期格式是否为 bash 中的 ISO 8601
【发布时间】:2021-10-23 16:28:44
【问题描述】:

如何通过 bash 脚本验证我的日期时间字符串是否具有带时区 (+0200) 的有效 ISO-8601 格式?

可接受的格式只有%Y-%m-%dT%H:%M:%S+0200

编辑: 我可以将年份设置为 0001、9999 或任何 4 位数字的随机排列。我只需要强制执行语法检查。

【问题讨论】:

    标签: bash date datetime


    【解决方案1】:

    这是一个简单的 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 文章。

    正则表达式不会对值进行任何范围检查。

    【讨论】:

      【解决方案2】:

      这是一个不使用任何正则表达式并使用 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'
      

      【讨论】:

        【解决方案3】:

        如果您希望针对任何时区验证您的 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,这限制了它的可移植性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多