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 one and last three produce filename-friendly strings.
A big thanks to the following folks for pointing out mistakes and suggesting useful format inclusions:
- 2013-05: Rich for the reminder to include UTC and timezoned stamps.
- 2017-10: “Hamilton and Meg” (haha!) for pointing out I had my 4 year example formats messed up and for prodding me to include a 2-year example.
- 2018-01: Autumn Gray for suggesting that I add examples of including short and long days of the week.
#! /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 --------------------------------+----------------------------+------------------------------ YYYY-MM-DD_hh:mm:ss | date +%F_%T | $(date +%F_%T) YYYYMMDD_hhmmss | date +%Y%m%d_%H%M%S | $(date +%Y%m%d_%H%M%S) YYYYMMDD_hhmmss (UTC version) | date --utc +%Y%m%d_%H%M%SZ | $(date --utc +%Y%m%d_%H%M%SZ) YYYYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z | $(date +%Y%m%d_%H%M%S%Z) YYYYMMSShhmmss | date +%Y%m%d%H%M%S | $(date +%Y%m%d%H%M%S) YYYYMMSShhmmssnnnnnnnnn | date +%Y%m%d%H%M%S%N | $(date +%Y%m%d%H%M%S%N) YYMMDD_hhmmss | date +%y%m%d_%H%M%S | $(date +%y%m%d_%H%M%S) 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 UTC timestamp + ms | date --utc +%FT%T.%3NZ | $(date --utc +%FT%T.%3NZ) ISO8601 Local TZ timestamp | date +%FT%T%Z | $(date +%FT%T%Z) YYYY-MM-DD (Short day) | date +%F\(%a\) | $(date +%F\(%a\)) YYYY-MM-DD (Long day) | date +%F\(%A\) | $(date +%F\(%A\)) EOD
If executed, it will produce the (obvious) output:
Format/result | Command | Output --------------------------------+----------------------------+------------------------------ YYYY-MM-DD_hh:mm:ss | date +%F_%T | 2018-01-24_13:06:51 YYYYMMDD_hhmmss | date +%Y%m%d_%H%M%S | 20180124_130651 YYYYMMDD_hhmmss (UTC version) | date --utc +%Y%m%d_%H%M%SZ | 20180124_040651Z YYYYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z | 20180124_130651JST YYYYMMSShhmmss | date +%Y%m%d%H%M%S | 20180124130651 YYYYMMSShhmmssnnnnnnnnn | date +%Y%m%d%H%M%S%N | 20180124130651170243401 YYMMDD_hhmmss | date +%y%m%d_%H%M%S | 180124_130651 Seconds since UNIX epoch: | date +%s | 1516766811 Nanoseconds only: | date +%N | 174236092 Nanoseconds since UNIX epoch: | date +%s%N | 1516766811175655627 ISO8601 UTC timestamp | date --utc +%FT%TZ | 2018-01-24T04:06:51Z ISO8601 UTC timestamp + ms | date --utc +%FT%T.%3NZ | 2018-01-24T04:06:51.178Z ISO8601 Local TZ timestamp | date +%FT%T%Z | 2018-01-24T13:06:51JST YYYY-MM-DD (Short day) | date +%F\(%a\) | 2018-01-24(水) YYYY-MM-DD (Long day) | date +%F\(%A\) | 2018-01-24(水曜日)
Note that the last two, short and long day-of-week are dependent on the environment variable LANG
. After setting LANG=en_US
we wind up with the following:
YYYY-MM-DD (Short day) | date +%F\(%a\) | 2018-01-24(Wed) YYYY-MM-DD (Long day) | date +%F\(%A\) | 2018-01-24(Wednesday)