79

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?

1
  • 1
    In case it's not obvious, the answers with date -d generally apply to GNU date (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 POSIX date, which doesn't really support meaningful conversions between date formats. Commented Dec 22, 2022 at 17:33

7 Answers 7

109
#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 

More on Dates

note this only works on GNU date

I have read that:

Solaris version of date, which is unable to support -d can be resolve with replacing sunfreeware.com version of date

Sign up to request clarification or add additional context in comments.

Comments

20

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 

2 Comments

Very helpful. date seems to behave quirky on macOS
Unfortunately doesn't work for Linux (at least date on Ubuntu 22.10 fails with invalid option -j)
16
date -d "25 JUN 2011" +%Y%m%d 

outputs

20110625 

Comments

11

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' 

Comments

7

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 

Comments

6

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 

1 Comment

It reports : date: invalid date ‘Thu 18 Mar 11:58:32 GMT 2021’
0

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.

1 Comment

-d sets the date you want to format. Without it, date formats the current date.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.