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这样的格式!(月份是按字面写的)
有了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 日,星期五