Linux Bash - 日期格式

Vin*_*nce 5 linux bash shell formatting date

我的日期格式是yyyy-mm-dd-hh:mm:ss如何检查我的输入?

它应该是这样的:

#!/bin/bash

read -p "Date (format yy-mm-dd-HH-MM-SS): " input

check=$(date +"%Y-%m-%d-%H:%M:%S")

if [ $input -eq $check ]; do

     echo "Right!"

else
     echo "False!"

fi
Run Code Online (Sandbox Code Playgroud)

但这并没有检查日期它将我的输入与实际日期进行比较.

最好的问候文斯

tec*_*hno 10

2016年4月编辑!

进一步了解(更强的方法)

原帖

尝试:

#!/bin/bash

read -p "Date (format yyyy-mm-dd): " input
check=$(date +%F)

if [ "$input" == "$check" ]; then
    echo "Right!"
else
    echo "False!"
fi
Run Code Online (Sandbox Code Playgroud)

要么

#!/bin/bash

read -p "Date (format YYYY-MN-DD-HH24:MM:SS): " input
check=$(date +%F-%T)

if [ "$input" == "$check" ]; then
    echo "Right!"
else
    echo "False!"
fi
Run Code Online (Sandbox Code Playgroud)

测试良好:

cat >hesdate.sh     # Copy 1st sample and paste to terminal
chmod +x hesdate.sh
date +%F ; ./hesdate.sh
2013-01-04
Date (format yyyy-mm-dd): 2013-01-04
Right!

cat >hesdate.sh     # Copy 2nd sample and paste to terminal
date -d now\ +10\ sec +%F-%T ; ./hesdate.sh 
2013-01-04-10:17:06                                       # copy this line
Date (format YYYY-MN-DD-HH24:MM:SS): 2013-01-04-10:17:06  # past exactly 10 secs after
Right!
Run Code Online (Sandbox Code Playgroud)

编辑添加

要测试日期,您可以:

[[ $input =~ ^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$ ]]

if [[ $input =~ ^2012-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$ ]];then
Run Code Online (Sandbox Code Playgroud)

和/或

inputSecs=$(date -d "${input%-*} ${input##*-}" +%s)
Run Code Online (Sandbox Code Playgroud)

使用boot方法可以确认输入的格式 可靠性

更强的方法

如果要检查输入,有一个更好的方法:

unset adate
declare -A adate
date=2013-12-04-10:17:06
for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do
   sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*}
   crt=${date##*${sep:-#}}
   ((min<=10#$crt&&10#$crt<=max)) && adate[$field]=$crt ||
       echo Error: $crt not between $min and $max in $field field.
   date=${date%$sep*}
 done
declare -p adate
Run Code Online (Sandbox Code Playgroud)

这将转储adate数组变量:

declare -A adate='([D]="04" [M]="12" [Y]="2013" [h]="10" [m]="17" [s]="06" )'
Run Code Online (Sandbox Code Playgroud)

从那里,您可以重新验证日期编号:

max=$(date -d "${adate[Y]}-${adate[M]}-1 +1 month -1 day" +%d)
((10#${adate[D]}>max)) && echo "Error Day number too high: (${adate[D]}>$max)."
Run Code Online (Sandbox Code Playgroud)

唯一没有测试的是场长

date=2012-02-29-10:17:06
Run Code Online (Sandbox Code Playgroud)

会工作的

date=2012-2-29-10:17:06
Run Code Online (Sandbox Code Playgroud)

也会工作(白天只有一个数字).

如果需要,您可以更改该行:

for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do
sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*}
crt=${date##*${sep:-#}}
Run Code Online (Sandbox Code Playgroud)

对于

for field in s:20-59 m:20-59 h-20-23 D-21-31 M-21-12 Y#42000-2100 ;do
sep=${field:1:1} len=${field:2:1} min=${field:3} field=${field:0:1} max=${min#*-} min=${min%-*}
crt=${date##*${sep:-#}}
[ ${#crt} -eq $len ] || echo "Error: Field $field is no $len len: ${#crt}."
Run Code Online (Sandbox Code Playgroud)

注意:年份字段在2000年到2100年之间被任意限制,但这很容易理解/改变.