bashshelldatedate-formattingstrftime

YYYY-MM-DD format date in shell script


I tried using $(date) in my bash shell script, however, I want the date in YYYY-MM-DD format.
How do I get this?


Solution

  • In bash (>=4.2) it is preferable to use printf's built-in date formatter (part of bash) rather than the external date (usually GNU date). Note that invoking a subshell has performance problems in Cygwin due to a slow fork() call on Windows.

    As such:

    # put current date as yyyy-mm-dd in $date
    # -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
    # -2 -> start time for shell
    printf -v date '%(%Y-%m-%d)T\n' -1
    
    # put current date as yyyy-mm-dd HH:MM:SS in $date
    printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1
    
    # to print directly remove -v flag, as such:
    printf '%(%Y-%m-%d)T\n' -1
    # -> current date printed to terminal
    

    In bash (<4.2):

    # put current date as yyyy-mm-dd in $date
    date=$(date '+%Y-%m-%d')
    
    # put current date as yyyy-mm-dd HH:MM:SS in $date
    date=$(date '+%Y-%m-%d %H:%M:%S')
    
    # print current date directly
    echo $(date '+%Y-%m-%d')
    

    Other available date formats can be viewed from the date man pages (for external non-bash specific command):

    man date