Come posso ottenere una data formattata per un timestamp UNIX dalla riga di comando


59

Ho un timestamp UNIX e mi piacerebbe ottenere una data formattata (come l'output di date) corrispondente a quel timestamp.

I miei tentativi finora:

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

Mi piacerebbe essere in grado di ottenere output come:

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

Risposte:


92

Su Mac OS X e BSD:

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

con gli strumenti di base GNU (devi scavare nel file informativo per quello):

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

Con entrambi, aggiungi l' -uopzione (standard) o passa una TZ=UTC0variabile d'ambiente per avere la data UTC ( TZ=UTC0 definisce un fuso orario chiamato UTCcon offset 0 da UTC mentre il comportamento per TZ=UTC(senza offset) non è specificato (sebbene sulla maggior parte dei sistemi farebbe riferimento a un fuso orario definito dal sistema chiamato anche UTCcon offset 0 da UTC)).


1
Ci vuole molto da scavare, tuttavia, il che è sorprendente per un compito così comune.
David Z,

Grazie, ho accettato la tua risposta. Avrei dovuto leggere info coreutils dateun po 'più attentamente.
Umang,

Questo mi sta dando una data leggermente diversa: date -r 1447264553943risulta Wed Dec 28 01:39:03 BRST 47831, quando è effettivamente 11/11/2015, 3:55:53 PM GMT-2:00.
falmp,

1
@falmp: funzionerà se usi secondi invece di microsecondi.

@hop ops, avrebbe dovuto capire che l'anno era 47831, ma quel numero era così alto che l'ho perso. Grazie!
falmp,

6

Dopo aver cercato su Google, ho trovato il modo di farlo solo con il datecomando:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010

Grazie per quello Speravo che ci sarebbe stato qualcosa di più semplice, quindi per ora solo un voto positivo.
Umang,

un altro ottimo esempio di come Google ti rende stupido. nessuno legge più la documentazione?

1
@hop, il supporto per date -d @xxxnon è stato aggiunto fino a coreutils 5.3 nel 2005. È così che dovevi farlo prima.
Stéphane Chazelas,

@ StéphaneChazelas: a) questa risposta è del 2010 eb) perché questa scusa cerca su Google prima di leggere la documentazione? Se rispondi dalla tua stessa autorità, puoi scusare di fare errori come questo, ma se devi comunque cercarlo, cercalo nel modo giusto.

@hop, stavo solo sottolineando che non era una risposta stupida, ma obsoleta.
Stéphane Chazelas,

6

Questo perl one-liner lo farà:

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

5

Con shell incorporati:

  • zsh (4.1.1 (2003) e versioni successive):

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

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

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

In tutti questi, sostituire %ccon il strftime()formato desiderato.


Hai un riferimento per la bash printfsoluzione?
Derek Mahar,

Non importa, l'ho trovato nella descrizione di printfin gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Derek Mahar,

2

Su osx, per avere in UTC

date -r "1475737200" -u

Grazie. L'ho modificato nella risposta accettata in modo che le informazioni siano più facilmente disponibili.
Stéphane Chazelas,

1

Un altro esempio chiaro del ricco patrimonio di Unix moderno. Questo è effettivamente possibile nella maggior parte delle varianti di BSD:

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

(A proposito il tuo esempio sembra essere spento di un secondo)


Non funziona su Linux. la risposta di hop sembra avere la risposta Linux corretta. Grazie per averlo sottolineato, sospettavo che potesse succedere qualcosa del genere, ce l'ho fatta 45 secondi adesso.
Umang,

1

Rispondi a una vecchia domanda, ma penso che questo potrebbe essere un miglioramento se qualcun altro lo cerca. Questa funzione di Bash funziona sia su Linux che su OS X. Non ho testato su altri sistemi BSD. Passa il tempo dell'epoca come argomento a questa funzione e stamperà il formato dell'ora RFC-3339.

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    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
    else
        # OS X/BSD
        date -r ${EPOCH} ${RFC3339_FORMAT}
    fi
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.