shell 中的日期验证

chh*_*rma 15 shell-script date

我想在 shell 脚本中验证以下日期格式

2015-Jul-13
Run Code Online (Sandbox Code Playgroud)

我正在使用,date -d "2015-Jul-13" +"%Y-%b-%d"但它给出的错误是

date: invalid date '2015-Jul-13'
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 12

GNUdate不支持YYYY-MMM-DD. 不过,它确实明白DD-MMM-YYYY。所以如果你真的必须处理这种格式的日期,你可以用这样的方法来完成,它只是将参数交换为date期望的格式:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi
Run Code Online (Sandbox Code Playgroud)

这是一个全壳解决方案。分解它,IFS=-指令告诉 shell 用连字符-而不是空格分割即将到来的命令行。的set $ymd解析$ymd变量作为一个命令行,但现在由连字符分割,分配值的参数$1$2 及以下。在echo "$3-$2-$1"平凡输出以相反的顺序三个捕获的值。

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi
Run Code Online (Sandbox Code Playgroud)


Pan*_*dya 11

从联机帮助页:-

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.
Run Code Online (Sandbox Code Playgroud)

但是好像不能识别YYYY-MMM-DD格式。因此,您可以使用下面的或类似的:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13
Run Code Online (Sandbox Code Playgroud)

或者你必须在发送到之前转换/重新格式化date

另请参阅如何为迄今为止的输入指定格式?


我建议访问:日期输入格式

这是规则。

对于数字月份,允许使用 ISO 8601 格式“年-月-日”,其中年是任何正数,月是 01 和 12 之间的数字,日是 01 和 31 之间的数字。必须存在前导零如果一个数字小于十。如果年份为 68 或更小,则添加 2000;否则,如果年份小于 100,则添加 1900。接受在美国流行的构造“月/日/年”。也是“月/日”,省略年份。

文字月份可以完整拼写:“January”、“February”、“March”、“April”、“May”、“June”、“July”、“August”、“September”、“October”、“十一月”或“十二月”。文字月份可以缩写为前三个字母,后面可能跟一个缩写点。也允许写“Sept”而不是“September”。

当按字面写月时,日历日期可以是以下任何一种:

 日月年
 日月
 月日年
 日月年

我强调

在这里你可以看到没有像year-month-day这样的格式!(月份是按字面写的)


don*_*sti 7

有了zsh您可以使用strftime内置的(通过提供zsh/datetime)与-r(反向):

strftime -r格式化时间字符串

它使用格式来解析时间字符串并输出自纪元以来的秒数:

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
Run Code Online (Sandbox Code Playgroud)
1436734800

如果日期无效,则会出错:

strftime -r %Y-%b-%d 2015-Jul-33
Run Code Online (Sandbox Code Playgroud)
zsh:strftime:5: 格式不匹配

您还可以将自纪元以来的秒数转换为任何其他标准/自定义日期格式,例如

strftime '%A, %B %d, %Y' 1447970400
Run Code Online (Sandbox Code Playgroud)
2015 年 11 月 20 日,星期五