我想在 shell 脚本中验证以下日期格式
2015-Jul-13
我正在使用date -d "2015-Jul-13" +"%Y-%b-%d"
,但它给出的错误为
date: invalid date '2015-Jul-13'
答案1
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
这是一个全外壳解决方案。分解它,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
答案2
来自联机帮助页:-
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.
但好像不认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
或者你必须转换/重新格式化发送之前就可以了date
!
另请参阅如何指定迄今为止的输入格式?
我建议访问:日期输入格式。
这是规则。
对于数字月份,允许使用 ISO 8601 格式“年-月-日”,其中年是任何正数,月是 01 到 12 之间的数字,日是 01 到 31 之间的数字。如果数字必须存在前导零小于十。如果年份为 68 或更小,则添加 2000;否则,如果年份小于 100,则添加 1900。在美国流行的结构“月/日/年”被接受。也是“月/日”,省略年份。
月份可以完整拼写为:“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”或“十二月”。文字月份可以缩写为前三个字母,后面可能跟一个缩写点。也允许写“Sept”而不是“September”。
当月份按字面书写时,日历日期可以指定为以下任意一种:
日月年
日月月日
年
日月年
我强调的
在这里你可以看到没有类似的格式年月日! (月份是按字面意思写的)
答案3
您zsh
可以使用strftime
内置函数(可通过zsh/datetime
)与-r
(反向):
strftime -r格式化时间字符串
它使用格式来解析时间串并输出自纪元以来的秒数:
zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800
如果日期无效,则会出现错误:
strftime -r %Y-%b-%d 2015-Jul-33
zsh:strftime:5: 格式不匹配
您还可以将自纪元以来的秒数转换为任何其他标准/自定义日期格式,例如
strftime '%A, %B %d, %Y' 1447970400
2015 年 11 月 20 日星期五