How do I convert an epoch timestamp to a human readable format on the cli? I think there's a way to do it with date but the syntax eludes me (other ways welcome).
12 Answers
On *BSD:
date -r 1234567890
On Linux (specifically, with GNU coreutils ≥5.3):
date -d @1234567890
With older versions of GNU date, you can calculate the relative difference to the UTC epoch:
date -d '1970-01-01 UTC + 1234567890 seconds'
If you need portability, you're out of luck. The only time you can format with a POSIX shell command (without doing the calculation yourself) line is the current time. In practice, Perl is often available:
perl -le 'print scalar localtime $ARGV[0]' 1234567890

- 113

- 829,060
If your epoch time is in milliseconds instead of seconds, either put a dot before last three digits (as hinted in comments by user79743), or remove the last three digits before passing it to date -d
:
Entered directly, this gives incorrect result :
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
Put a dot before last three digits:
$ date -d @1455086371.603
Tue Feb 9 22:39:32 PST 2016 #Correct
Or, remove the last three digits:
$ date -d @1455086371
Tue Feb 9 22:39:31 PST 2016 #Correct after removing the last three digits. You may remove and round off the last digit too.

- 491
-
-
1I have seen that WebLogic Application server mostly returns data time values with milliseconds and no dots when using scripting tool. e.g., lastSuccessfulConnectionUse=1455086371603 – KnockTurnAl Feb 10 '16 at 08:49
-
I see. This page confirms Raw Time Value The timestamp in milliseconds. Thanks. – Feb 10 '16 at 10:11
-
1
-
With bash-4.2
or above:
$ printf '%(%FT%T%z)T\n' 1234567890
2009-02-13T23:31:30+0000
(where %FT%T%z
is the strftime()
-type format, here using standard unambiguous format which includes the UTC offset (%z
))
That syntax is inspired from ksh93
.
In ksh93
however, the argument is taken as a date expression where various and hardly documented formats are supported.
For a Unix epoch time, the syntax in ksh93
is:
printf '%(%FT%T%z)T\n' '#1234567890'
ksh93
however seems to use its own algorithm for the timezone and can get it wrong. For instance, in mainland Britain, it was summer time all year in 1970, but:
$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan 1 00:00:00 1970
ksh93 (and zsh's strftime
builtin) support subsecond, not bash yet:
$ ksh -c 'printf "%(%FT%T.%6N%z)T\n" 1234567890.123456789'
2009-02-13T23:31:30.123456-0000
$ zsh -c 'zmodload zsh/datetime; strftime %FT%T.%6.%z 1234567890 123456780'
2009-02-13T23:31:30.123457+0000

- 544,893
Custom format with GNU date
:
date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Or with GNU awk
:
awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Linked SO question: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
This can come in handy for those applications which use epoch time in the logfiles:
$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu May 13 10:15:46 2010] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;HOSTA;check_raid;0;check_raid.pl: OK (Unit 0 on Controller 0 is OK)

- 19,754
- 24
- 70
- 85
The two I frequently use are:
$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009
and
$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009

- 309
-
1Love this
tclsh
suggestion, that seems much easier to remember than most of the incantations in this thread – phette23 Aug 10 '21 at 19:09 -
The perl one worked for me with timestamp formated like
1.679703228911E9
– Pierre Mar 31 '23 at 10:05
With zsh
you could use the strftime
builtin:
strftime format epochtime Output the date denoted by epochtime in the format specified.
e.g.
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Friday, 13 Feb 2009
There's also dateconv
from dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Friday, 13 Feb 2009
keep in mind dateutils
tools default to UTC
(add -z your/timezone
if needed).

- 82,805
-
-
On Debian, the
dateutils
package has thedateutils.dconv
binary instead ofdateconv
. I'm assuming it's the same thing, but renamed. – cstroe Jul 28 '22 at 16:32
In PowerShell:
(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")

- 434,908
-
This technique is using Microsoft .NET. It doesn't seem OP is looking for an MS solution. – user2320464 Sep 20 '19 at 20:40
-
4
-
@StephenKitt, but does
PowerShell
run on HP-UX? Seeming no: https://www.reddit.com/r/PowerShell/comments/8cx8dp/powershell_6_core_and_rhel_and_hpux/ .And this is
– saulius2 Sep 03 '20 at 06:58unix.
-
@saulius2 by that reasoning, most of the content of Unix.SE is invalid, because it’s possible to find a Unix system where it isn’t applicable. This is Unix & Linux Stack Exchange. – Stephen Kitt Sep 04 '20 at 06:54
-
@StephenKitt, maybe it's so, I made no research about quality of the questions. But just by looking at the right side of this page I see three of them which are asking about the specific OS:
https://unix.stackexchange.com/questions/86507/convert-timestamp-to-formatted-time-osx
https://unix.stackexchange.com/questions/96189/convert-unix-timestamp-into-human-readable-format-on-aix
https://unix.stackexchange.com/questions/434844/convert-a-date-to-unix-timestamp-on-openbsd
– saulius2 Sep 05 '20 at 06:15
You could also use a little C program for printing the datetime in the format that can be directly parsed by shell
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int argc, char * argv[]) {
if (argc==1) {
return 1;
}
struct tm input_tm;
char * formatStr = "YEAR=%Y\nMON=%m\nDAY=%d\nHOUR=%H\nMIN=%M\nSEC=%S";
size_t formatSize = strlen(formatStr) + 2;
char * output = (char *)malloc(sizeof(char)*formatSize);
strptime(argv[1],"%s",&input_tm);
strftime(output, formatSize, formatStr, &input_tm);
printf("%s\n",output);
free(output);
return 0;
}
usage:
#compile
clang -o epoch2datetime main.c
#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11

- 302
-
1Doesn't work on HP-UX:
– saulius2 Sep 03 '20 at 07:16./a.out 1599099168
YEAR=1901
MON=03
DAY=00
HOUR=2130568304
MIN=
-
@saulius2 ... what? I completely believe you, but the situation is kind of crazy. HP-UX can't correctly handle
stdio.h
,stdlib.h
,string.h
, andtime.h
in Standard (ANSI/ISO) C !?!?!?. . . . . . . . . . . . . . . .
What thefor i in {1..4}; do ascii_base10_val=$(echo "33+$(shuf -i 0-14 -n 1)" | bc -l); ascii_hex_val=$(echo "obase=16; ${ascii_base10_val}" | bc); printf "\x${ascii_hex_val}"; done; echo
has HP-UX done!. . . . . . . . . . . . . . . . . . . . . . . . .
(The code will give a cartoon representation of a cuss word, by the way.) – bballdave025 Aug 18 '22 at 21:27 -
Well, I didn't investigate at the time, and now I have lost access to these HP-UX boxes, so I cannot investigate at the moment too. – saulius2 Aug 19 '22 at 07:35
Wouldn't be a real solution without a little node.js:
epoch2date(){
node -p "new Date($1)"
}
add that to ~/.bash_aliases
and make sure its sourced in ~/.bashrc
with . ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
To get node on your system goto http://nvm.sh and run the curl command. It'll install node version manager (nvm) which allows you to switch versions of node.
Just type nvm ls-remote
and pick a version to nvm install <version>
.

- 2,069
-
Does
node.js
run on HP-UX? Seemingly no: https://github.com/playnodeconf/ama/issues/10#issuecomment-211250773 – saulius2 Sep 03 '20 at 06:55
If UTC is your preference (for the sample epoch timestamp 1666666666),
$ # long options; Linux
$ date --date=@1666666666 --utc
Tue 14 Nov 22:13:20 UTC 2023
$ # short options; Linux
$ date -d @1666666666 -u
Tue 14 Nov 22:13:20 UTC 2023

- 223
- 2
- 5
@
mean indate -d @1234567890
?man date
made no reference to that... – Chris Markle Jan 14 '13 at 21:10info date
is quite complete. The entry at28.9 Seconds since the Epoch
explains in detail about the @timestamp. – Feb 10 '16 at 08:31-u
option. – ma11hew28 Jun 27 '20 at 12:45date -r 1234567890
works on macOS's fork of BSD FWIW – ijoseph Oct 09 '20 at 06:17env TZ=UTC date …
– Gilles 'SO- stop being evil' Jul 02 '21 at 21:11