Bagaimana saya bisa mendapatkan tanggal yang diformat untuk cap waktu UNIX dari baris perintah


59

Saya memiliki stempel waktu UNIX dan saya ingin mendapatkan tanggal yang diformat (seperti keluaran date) yang sesuai dengan stempel waktu itu.

Upaya saya sejauh ini:

$ 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'

Saya ingin bisa mendapatkan output seperti:

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

Jawaban:


92

Di Mac OS X dan BSD:

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

dengan alat inti GNU (Anda harus menggali melalui file info untuk itu):

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

Dengan salah satu, tambahkan opsi -u(standar), atau lulus TZ=UTC0variabel lingkungan untuk memiliki tanggal UTC ( TZ=UTC0 mendefinisikan zona waktu yang disebut UTCdengan offset 0 dari UTC sementara perilaku untuk TZ=UTC(tanpa offset) tidak ditentukan (meskipun pada kebanyakan sistem akan merujuk ke zona waktu yang ditentukan sistem juga disebut UTCdengan offset 0 dari UTC)).


1
Namun, ini membutuhkan banyak penggalian, yang mengejutkan untuk tugas umum seperti itu.
David Z

Terima kasih, terima jawaban Anda. Seharusnya saya membaca info coreutils datesedikit lebih hati-hati.
Umang

Ini memberi saya tanggal yang sedikit berbeda: date -r 1447264553943menghasilkan Wed Dec 28 01:39:03 BRST 47831, padahal sebenarnya 11/11/2015, 3:55:53 PM GMT-2:00.
falmp

1
@ falmp: ini akan bekerja jika Anda menggunakan detik, bukan mikrodetik.

@ ops ops, seharusnya menyangka dengan tahun menjadi 47.831, tetapi jumlah itu sangat tinggi saya melewatkannya. Terima kasih!
falmp

6

Setelah beberapa googling, saya menemukan cara untuk melakukannya hanya dengan dateperintah:

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

Terima kasih untuk itu. Saya berharap akan ada sesuatu yang lebih sederhana, jadi hanya suara untuk saat ini.
Umang

contoh bagus lain bagaimana Google membuat Anda bodoh. apakah tidak ada yang pernah membaca dokumentasi lagi?

1
@hop, dukungan untuk date -d @xxxtidak ditambahkan sampai coreutils 5.3 pada tahun 2005. Begitulah cara Anda harus melakukannya sebelum itu.
Stéphane Chazelas

@ StéphaneChazelas: a) jawaban ini dari 2010 dan b) mengapa ini memaafkan googling sebelum membaca dokumentasi? Jika Anda menjawab dari otoritas Anda sendiri, seseorang dapat memaafkan kesalahan seperti ini, tetapi jika Anda harus mencarinya, cari benar.

@hop, saya baru saja menunjukkan bahwa itu bukan jawaban yang bodoh, hanya yang sudah ketinggalan zaman.
Stéphane Chazelas

6

Perl one-liner ini akan melakukannya:

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

5

Dengan builtin shell:

  • zsh (4.1.1 (2003) dan lebih tinggi):

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

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

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

Dalam semua itu, ganti %cdengan strftime()format yang Anda inginkan.


Apakah Anda memiliki referensi untuk bash printfsolusinya?
Derek Mahar

Nevermind, saya menemukannya di deskripsi printfdi gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Derek Mahar

2

Di osx, ada di UTC

date -r "1475737200" -u

Terima kasih. Saya telah mengeditnya dalam jawaban yang diterima sehingga informasinya lebih mudah tersedia.
Stéphane Chazelas

1

Contoh rapi lain dari kekayaan warisan Unix modern. Ini memang mungkin di bawah sebagian besar varian BSD:

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

(BTW teladan Anda tampaknya mati satu detik)


Tidak berfungsi di Linux. jawaban hop tampaknya memiliki jawaban Linux yang benar. Terima kasih telah menunjukkan itu, saya curiga hal seperti itu akan terjadi, saya sudah 45 detik sekarang.
Umang

1

Jawab pertanyaan lama, tapi saya pikir ini mungkin perbaikan jika orang lain mencari ini. Fungsi Bash ini berfungsi pada Linux dan OS X. Saya belum menguji pada sistem BSD lainnya. Lewati waktu zaman sebagai argumen untuk fungsi ini dan itu akan mencetak format waktu 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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.