I have a UNIX timestamp and I'd like to get a formatted date (like the output of date) corresponding to that timestamp.

My attempts so far:

$ date +%s
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

I'd like to be able to get output like:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010

On Mac OS X and BSD:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d

with GNU core tools (you have to dig through the info file for that):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date

With either, add the -u (standard) option, or pass a TZ=UTC0 environment variable to have the UTC date (TZ=UTC0 defines a timezone called UTC with offset 0 from UTC while the behaviour for TZ=UTC (with no offset) is unspecified (though on most systems would refer to a system-defined timezone also called UTC with offset 0 from UTC)).

|improve this answer|||||
  • 1
    It takes a lot of digging, though, which is surprising for such a common task. – David Z Aug 21 '10 at 8:04
  • Thanks, accepted your answer. I should have read info coreutils date a little more carefully. – Umang Aug 21 '10 at 8:27
  • This is giving me a slightly different date: date -r 1447264553943 results in Wed Dec 28 01:39:03 BRST 47831, when it's actually 11/11/2015, 3:55:53 PM GMT-2:00. – falmp Nov 11 '15 at 18:01
  • 1
    @falmp: it will work if you use seconds instead of microseconds. – user601 Nov 12 '15 at 16:03
  • @hop ops, should have figured with the year being 47831, but that number was so high I missed it. Thanks! – falmp Nov 12 '15 at 22:25

After some googling, I found way to do it with the date command only:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
|improve this answer|||||
  • Thanks for that. I was hoping there'd be something simpler, so just an up vote for now. – Umang Aug 21 '10 at 6:36
  • another great example for how google makes you stupid. does nobody ever read the documentation anymore? – user601 Aug 21 '10 at 7:28
  • 1
    @hop, support for date -d @xxx was not added until coreutils 5.3 in 2005. That's how you had to do it before that. – Stéphane Chazelas Oct 7 '16 at 6:27
  • @StéphaneChazelas: a) this answer is from 2010 and b) why does this excuse googling before reading the documentation? If you answer from your own authority, one can excuse making errors like this, but if you have to look it up anyway, look it up right. – user601 Oct 7 '16 at 17:15
  • @hop, I was just pointing out that it was not a stupid answer, just an outdated one. – Stéphane Chazelas Oct 7 '16 at 21:51

This perl one-liner will do it:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
|improve this answer|||||

With shell builtins:

  • zsh (4.1.1 (2003) and above) :

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
  • ksh93 (ksh93i (2000) and above):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
  • bash (4.2 (2010) and above):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC

In all those, replace %c with the strftime() format you want.

|improve this answer|||||

Answer to an old question, but I think this might be an improvement if anyone else searches for this. This Bash function works on both Linux and OS X. I have not tested on any other BSD systems. Pass the epoch time as an argument to this function and it will print the RFC-3339 time format.

epochtorfc3339 ()
    EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds"
        #date -d @${EPOCH} --rfc-3339=seconds
        # OS X/BSD
        date -r ${EPOCH} ${RFC3339_FORMAT}
|improve this answer|||||

On osx, to have in UTC

date -r "1475737200" -u
|improve this answer|||||
  • Thanks. I've edited that in the accepted answer so the information is more readily available. – Stéphane Chazelas Oct 7 '16 at 6:09

Another neat example of the rich heritage of modern Unix. This is indeed possible under most BSD variants:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(BTW your example seems to be off by one second)

|improve this answer|||||
  • Doesn't work on Linux. hop's answer seems to have the correct Linux answer. Thanks for pointing that out, I suspected something like that would happen, I've made it 45 seconds now. – Umang Aug 21 '10 at 8:21

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.