Linux Date Format: change the date output for scripts or commands

Want to help support this blog? Try out Oh Dear, the best all-in-one monitoring tool for your entire website, co-founded by me (the guy that wrote this blogpost). Start with a 10-day trial, no strings attached.

We offer uptime monitoring, SSL checks, broken links checking, performance & cronjob monitoring, branded status pages & so much more. Try us out today!

Profile image of Mattias Geniar

Mattias Geniar, December 30, 2015

Follow me on Twitter as @mattiasgeniar

This is going to be a very simple guide, but one I often find myself needing (because who can remember these formats, right?).

The Linux date command by default has a pretty readable output.

$ date
Wed Dec 30 21:50:15 CET 2015

If also allows you to modify its output with special FORMAT options. Those are written as date +"FORMAT". Some examples below.

For instance, a simple YYYY-MM-DD representation:

$ date +"%Y-%m-%d"
2015-12-30

Or just to display the current time:

$ date +"%T"
21:55:16

Or a more complete example which follows the Apache log format of displaying dates (ie: [30/Dec/2015:21:48:45 +0100]).

$ date +"[%d/%b/%Y:%k:%M:%S %z]"
[30/Dec/2015:12:58:32 +0100]

The date command also allows you pretty easy manipulation of the “current date”. By default, date refers to “NOW”. It’ll show the current time or date when you execute the command. With the -d parameter you can also let it jump back & forth and show you a different date.

$ date +"%Y-%m-%d"
2015-12-30

$ date +"%Y-%m-%d" -d "8 days ago"
2015-12-22

$ date +"%Y-%m-%d" -d "next Sunday"
2016-01-03

$ date +"%Y-%m-%d" -d "last Friday"
2015-12-25

Here’s the complete list of modifiers. You can replace them in any of the examples above to get different outputs.

FORMAT controls the output.  Interpreted sequences are:
%%     a literal %
%a     locale’s abbreviated weekday name (e.g., Sun)
%A     locale’s full weekday name (e.g., Sunday)
%b     locale’s abbreviated month name (e.g., Jan)
%B     locale’s full month name (e.g., January)
%c     locale’s date and time (e.g., Thu Mar  3 23:05:25 2005)
%C     century; like %Y, except omit last two digits (e.g., 20)
%d     day of month (e.g, 01)
%D     date; same as %m/%d/%y
%e     day of month, space padded; same as %_d
%F     full date; same as %Y-%m-%d
%g     last two digits of year of ISO week number (see %G)
%G     year of ISO week number (see %V); normally useful only with %V
%h     same as %b
%H     hour (00..23)
%I     hour (01..12)
%j     day of year (001..366)
%k     hour ( 0..23)
%l     hour ( 1..12)
%m     month (01..12)
%M     minute (00..59)
%n     a newline
%N     nanoseconds (000000000..999999999)
%p     locale’s equivalent of either AM or PM; blank if not known
%P     like %p, but lower case
%r     locale’s 12-hour clock time (e.g., 11:11:04 PM)
%R     24-hour hour and minute; same as %H:%M
%s     seconds since 1970-01-01 00:00:00 UTC
%S     second (00..60)
%t     a tab
%T     time; same as %H:%M:%S
%u     day of week (1..7); 1 is Monday
%U     week number of year, with Sunday as first day of week (00..53)
%V     ISO week number, with Monday as first day of week (01..53)
%w     day of week (0..6); 0 is Sunday
%W     week number of year, with Monday as first day of week (00..53)
%x     locale’s date representation (e.g., 12/31/99)
%X     locale’s time representation (e.g., 23:13:48)
%y     last two digits of year (00..99)
%Y     year
%z     +hhmm numeric timezone (e.g., -0400)
%:z    +hh:mm numeric timezone (e.g., -04:00)
%::z   +hh:mm:ss numeric time zone (e.g., -04:00:00)
%:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
%Z     alphabetic time zone abbreviation (e.g., EDT)
By default, date pads numeric fields with zeroes.  The following optional flags may follow ‘%’:
-      (hyphen) do not pad the field
_      (underscore) pad with spaces
0      (zero) pad with zeros
^      use upper case if possible
#      use opposite case if possible

These modifiers are especially useful in scripts. You can get an easy-to-use date variable for logging to files like this.

$ cat script.sh
#!/bin/bash
TODAY=$(date +"%Y-%m-%d")

echo $TODAY

If you execute it:

$ ./script.sh
2015-12-30

Pretty easy.



Want to subscribe to the cron.weekly newsletter?

I write a weekly-ish newsletter on Linux, open source & webdevelopment called cron.weekly.

It features the latest news, guides & tutorials and new open source projects. You can sign up via email below.

No spam. Just some good, practical Linux & open source content.