The Intellectual Wilderness On Government: "There is nothing more useless than doing efficiently that which should not be done at all."

2013.04.20 13:46

Most common Bash date commands for timestamping

Filed under: Computing — Tags: , , , , — zxq9 @ 13:46

From time to time I get asked how to use the date command to generate a timestamp. Here is an idiot-friendly script you can post for reference in your team’s bin/ if you get interrupted about timestamp questions or have an aversion to typing phrases like “man date” (with or without a space).

All but the first and last two produce filename-friendly strings. (Thanks to Rich for the reminder to include UTC and timezoned stamps here):

#! /bin/bash

# An overly obvious reference for most commonly requested bash timestamps
# Now all you Mac fags can stop pestering me.

cat << EOD
        Format/result         |       Command              |          Output
YY-MM-DD_hh:mm:ss             | date +%F_%T                | $(date +%F_%T)
YYMMDD_hhmmss                 | date +%Y%m%d_%H%M%S        | $(date +%Y%m%d_%H%M%S)
YYMMDD_hhmmss (UTC version)   | date --utc +%Y%m%d_%H%M%SZ | $(date --utc +%Y%m%d_%H%M%SZ)
YYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z      | $(date +%Y%m%d_%H%M%S%Z)
YYMMSShhmmss                  | date +%Y%m%d%H%M%S         | $(date +%Y%m%d%H%M%S)
YYMMSShhmmssnnnnnnnnn         | date +%Y%m%d%H%M%S%N       | $(date +%Y%m%d%H%M%S%N)
Seconds since UNIX epoch:     | date +%s                   | $(date +%s)
Nanoseconds only:             | date +%N                   | $(date +%N)
Nanoseconds since UNIX epoch: | date +%s%N                 | $(date +%s%N)
ISO8601 UTC timestamp         | date --utc +%FT%TZ         | $(date --utc +%FT%TZ)
ISO8601 Local TZ timestamp    | date +%FT%T%Z              | $(date +%FT%T%Z)
ISO8601 UTC timestamp + ms    | date --utc +%FT%T.%3NZ     | $(date --utc +%FT%T.%3NZ)

If executed, it will produce the (obvious) output:

        Format/result         |       Command              |          Output
YY-MM-DD_hh:mm:ss             | date +%F_%T                | 2016-10-14_09:19:53
YYMMDD_hhmmss                 | date +%Y%m%d_%H%M%S        | 20161014_091953
YYMMDD_hhmmss (UTC version)   | date --utc +%Y%m%d_%H%M%SZ | 20161014_001953Z
YYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z      | 20161014_091953JST
YYMMSShhmmss                  | date +%Y%m%d%H%M%S         | 20161014091953
YYMMSShhmmssnnnnnnnnn         | date +%Y%m%d%H%M%S%N       | 20161014091953225313813
Seconds since UNIX epoch:     | date +%s                   | 1476404393
Nanoseconds only:             | date +%N                   | 230837143
Nanoseconds since UNIX epoch: | date +%s%N                 | 1476404393232904886
ISO8601 UTC timestamp         | date --utc +%FT%TZ         | 2016-10-14T00:19:53Z
ISO8601 Local TZ timestamp    | date +%FT%T%Z              | 2016-10-14T09:19:53JST
ISO8601 UTC timestamp + ms    | date --utc +%FT%T.%3NZ     | 2016-10-14T00:19:53.237Z



  1. “man date”… haaaaaaa…

    Comment by avraml — 2013.04.22 11:14 @ 11:14

  2. You nearly made me choke with those non-UTC timestamps! You want to add date --utc +%FT%TZ and date +%FT%T%Z? The “T” makes it a little harder to read at first, but it’s correct per ISO 8601.

    Comment by Rich — 2013.05.17 10:00 @ 10:00

  3. @Rich
    Not a bad point. I didn’t include anything with timezones. I didn’t articulate this clearly, but the primary motivation for the post/script was being pestered with questions about how to produce filename-friendly timestamps in scripts — hence the lack of characters that are tricky on some operating systems (colons, in particular).

    Anyway, its easy to forget about timezones living in a country where there is only one! I’ve updated the post with your examples, because they are indeed useful.

    Thanks for the input!

    Comment by zxq9 — 2013.05.17 10:16 @ 10:16

  4. Wow, for about 2-3 minutes I thought you were smart until I reached the following in your text:
    “# Now all you Mac fags can stop pestering me.”

    Now I just think you’re a complete loser.

    Comment by Mac Fag — 2014.05.6 08:51 @ 08:51

  5. @Mac Fag
    At the time I wrote this I was surrounded by the Mac Fag Clone Army (figuratively, at least). That comment was for them, but if you feel you belong in the same category you’re welcome to apply the label to yourself.

    Comment by zxq9 — 2014.05.6 12:10 @ 12:10

  6. “Mac Fag” might be a touch juvenile, but it clearly hit close to home for someone… i can’t imagine any other reason you left it in the comments than to troll.

    +1 for the Best in Show reference! Excellent demonstration why its stupid to try flaming someone on their own blog.

    Btw, writing this on my iPhone, which is actually quite annoying.

    Comment by Marzipan — 2014.05.6 16:50 @ 16:50

  7. When I posted this I never imagined that a single commented line would become such a topic for discussion.

    Comment by zxq9 — 2014.05.6 16:58 @ 16:58

  8. Brilliant. Both the post and the retort.

    Comment by apocalysque — 2015.12.18 13:06 @ 13:06

  9. I would like to get this:
    ISO8601 UTC timestamp | date –utc +%FT%TZ | 2013-05-17T01:16:09Z

    But with milliseconds also. I.E.

    Comment by Brian M — 2016.08.24 07:05 @ 07:05

  10. For three digits of the nanosecond output you can insert a length field before the “N”:
    date --utc +%FT%T.%3NZ
    I’ll add that to the list.


    Comment by zxq9 — 2016.10.14 09:16 @ 09:16

RSS feed for comments on this post.

Leave a comment

Powered by WordPress