I have a date in this format: "27 JUN 2011" and I want to convert it to 20110627
Is it possible to do in bash?
#since this was yesterday date -dyesterday +%Y%m%d #more precise, and more recommended date -d'27 JUN 2011' +%Y%m%d #assuming this is similar to yesterdays `date` question from you #http://stackoverflow.com/q/6497525/638649 date -d'last-monday' +%Y%m%d #going on @seth's comment you could do this DATE="27 jun 2011"; date -d"$DATE" +%Y%m%d #or a method to read it from stdin read -p " Get date >> " DATE; printf " AS YYYYMMDD format >> %s" `date -d"$DATE" +%Y%m%d` #which then outputs the following: #Get date >> 27 june 2011 #AS YYYYMMDD format >> 20110627 #if you really want to use awk echo "27 june 2011" | awk '{print "date -d\""$1FS$2FS$3"\" +%Y%m%d"}' | bash #note | bash just redirects awk's output to the shell to be executed #FS is field separator, in this case you can use $0 to print the line #But this is useful if you have more than one date on a line note this only works on GNU date
I have read that:
Solaris version of date, which is unable to support
-dcan be resolve with replacing sunfreeware.com version of date
On OSX, I'm using -f to specify the input format, -j to not attempt to set any date, and an output format specifier. For example:
$ date -j -f "%m/%d/%y %H:%M:%S %p" "8/22/15 8:15:00 am" +"%m%d%y" 082215 Your example:
$ date -j -f "%d %b %Y" "27 JUN 2011" +%Y%m%d 20110627 date seems to behave quirky on macOSdate on Ubuntu 22.10 fails with invalid option -j)If you would like a bash function that works both on Mac OS X and Linux:
# # Convert one date format to another # # Usage: convert_date_format <input_format> <date> <output_format> # # Example: convert_date_format '%b %d %T %Y %Z' 'Dec 10 17:30:05 2017 GMT' '%Y-%m-%d' convert_date_format() { local INPUT_FORMAT="$1" local INPUT_DATE="$2" local OUTPUT_FORMAT="$3" local UNAME=$(uname) if [[ "$UNAME" == "Darwin" ]]; then # Mac OS X date -j -f "$INPUT_FORMAT" "$INPUT_DATE" +"$OUTPUT_FORMAT" elif [[ "$UNAME" == "Linux" ]]; then # Linux date -d "$INPUT_DATE" +"$OUTPUT_FORMAT" else # Unsupported system echo "Unsupported system" fi } # Example: 'Dec 10 17:30:05 2017 GMT' => '2017-12-10' convert_date_format '%b %d %T %Y %Z' 'Dec 10 17:30:05 2017 GMT' '%Y-%m-%d' Just with bash:
convert_date () { local months=( JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ) local i for (( i=0; i<11; i++ )); do [[ $2 = ${months[$i]} ]] && break done printf "%4d%02d%02d\n" $3 $(( i+1 )) $1 } And invoke it like this
d=$( convert_date 27 JUN 2011 ) Or if the "old" date string is stored in a variable
d_old="27 JUN 2011" d=$( convert_date $d_old ) # not quoted It's enough to do:
data=`date` datatime=`date -d "${data}" '+%Y%m%d'` echo $datatime 20190206 If you want to add also the time you can use in that way
data=`date` datatime=`date -d "${data}" '+%Y%m%d %T'` echo $data Wed Feb 6 03:57:15 EST 2019 echo $datatime 20190206 03:57:15 Maybe something changed since 2011 but this worked for me:
$ date +"%Y%m%d" 20150330 No need for the -d to get the same appearing result.
date -dgenerally apply to GNUdate(so, most Linux platforms) while e.g. BSD and thus MacOS support different options and facilities. For complete portability, you want to restrict yourself to POSIXdate, which doesn't really support meaningful conversions between date formats.