Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linux Bash - Date Format

My date format is yyyy-mm-dd-hh:mm:ss How do I check my input?

It should be something like this:

#!/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

But that doesn't check the date It compares my input with the real date.

Best Regards Vince

like image 758
Vince Avatar asked Jan 04 '13 07:01

Vince


People also ask

What is date +% s in bash?

date +%S. Displays seconds [00-59] date +%N. Displays in Nanoseconds.

How do I only display a date in bash?

Bash Date Format MM-DD-YYYY To format date in MM-DD-YYYY format, use the command date +%m-%d-%Y . Please observe the upper and lower case letters : %m for month, %d for day and %Y for year.

How do I get current date in bash?

Sample shell script to display the current date and time #!/bin/bash now="$(date)" printf "Current date and time %s\n" "$now" now="$(date +'%d/%m/%Y')" printf "Current date in dd/mm/yyyy format %s\n" "$now" echo "Starting backup at $now, please wait..." # command to backup scripts goes here # ...


1 Answers

Edited apr 2016!

See further (stronger method)

Original post

Try:

#!/bin/bash

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

if [ "$input" == "$check" ]; then
    echo "Right!"
else
    echo "False!"
fi

or

#!/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

Well tested:

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!

Edit add

For testing a date, you could:

[[ $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

and/or

inputSecs=$(date -d "${input%-*} ${input##*-}" +%s)

Using boot method let you confirm format and reliability of input

Stronger method

If you want to check input, there is a finer method:

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

This will dump adate array variable:

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

From there, you could re-validate day number:

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)."

The only thing not tested there is field length if

date=2012-02-29-10:17:06

will work, then

date=2012-2-29-10:17:06

will work too (there is only one digit in day field).

If needed, you could change the line:

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:-#}}

for

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}."

Nota: Year field is arbitrarily limited between 2000 and 2100, but this is easy to understand/change.

like image 79
techno Avatar answered Sep 21 '22 05:09

techno