162

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).

11 Answers 11

247

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
  • 4
    +1 for the comment about the lack of portability (why doesn't the POSIX spec include a way to do this? grr) – Richard Hansen Feb 1 '12 at 22:50
  • 2
    What does the @ mean in date -d @1234567890? man date made no reference to that... – Chris Markle Jan 14 '13 at 21:10
  • 9
    @ChrisMarkle GNU man pages are often woefully incomplete. “The date string format is more complex than is easily documented here but is fully described in the info documentation.” To wit: gnu.org/software/coreutils/manual/html_node/… – Gilles Jan 14 '13 at 21:56
  • 1
    The info date is quite complete. The entry at 28.9 Seconds since the Epoch explains in detail about the @timestamp. – user79743 Feb 10 '16 at 8:31
  • In Linux in a pipe: date +'%s' | xargs -I n date -d @n – Ivan Ogai Aug 12 '16 at 13:08
26

date -d @1190000000 Replace 1190000000 with your epoch

  • 8
    Assuming GNU date, that is. – Gilles Oct 11 '10 at 18:14
14
$ 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)
10

With bash-4.2 or above:

printf '%(%F %T)T\n' 1234567890

(where %F %T is the strftime()-type format)

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 '%(%F %T)T\n' '#1234567890'

ksh93 however seems to use its own algorithm for the timezone and can get it wrong. For instance, in 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
6

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
6

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

  • 2
    Only works for GNU date and GNU awk. Neither awk nor nawk support strftime. – DarkHeart Jul 28 '14 at 3:56
6

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).

5

If your epoch time is in milliseconds instead of seconds, remove the last three digits before passing it to date -d:

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

This gives incorrect data. 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.
  • What utility prints included milliseconds (without a dot) ? – user79743 Feb 10 '16 at 8:35
  • I 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 8:49
  • I see. This page confirms Raw Time Value The timestamp in milliseconds. Thanks. – user79743 Feb 10 '16 at 10:11
  • Atlassian tools log their timestamps as epoch time with milliseconds. – Br.Bill Mar 7 at 21:09
0

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
0

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>.

-1

PowerShell – Convert Unix or Epoch time to readable format

http://winplat.net/2015/12/14/powershell-convert-unix-or-epoch-time-to-readable-format/

  • Hi! When posting a link, it's best to include the most important parts of information from it, so that it is still available here on U+L, even when the link eventually breaks. It would be great if you could edit your answer to improve it. – dhag Dec 14 '15 at 16:48
  • Powershell being a windows only utility is quite off topic on unix.stackexchange.com – jlliagre Apr 12 '16 at 22:44
  • Powershell is now available for Linux and Mac. Not that I'm a Powershell fan, but you can use it now if you like. – Br.Bill Mar 7 at 21:10

Your Answer

By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.