Ubah stempel waktu Unix menjadi string tanggal


128

Apakah ada cara cepat satu baris untuk mengonversi stempel waktu Unix menjadi tanggal dari baris perintah Unix?

datemungkin berhasil, kecuali agak canggung untuk menentukan setiap elemen (bulan, hari, tahun, jam, dll.), dan saya tidak tahu bagaimana membuatnya berfungsi dengan baik. Sepertinya ada cara yang lebih mudah - apakah saya melewatkan sesuatu?


Jawaban:


181

Dengan GNU, dateAnda dapat melakukan:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(Dari: BASH: Ubah Stempel Waktu Unix menjadi Tanggal )

Di OS X, gunakan date -r.

date -r "$TIMESTAMP"

Alternatifnya, gunakan strftime(). Ini tidak tersedia langsung dari shell, tetapi Anda dapat mengaksesnya melalui gawk . The %cspecifier menampilkan timestamp secara lokal tergantung.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST

3
Pastikan untuk menghilangkan milidetik dari stempel waktu (hanya 10 digit, bukan 13), jika tidak, Anda akan mendapatkan hasil yang tidak valid (ini berlaku untuk tanggal macOS).
emerino

Saya pikir ini tidak berhasil, sampai saya menyadari bahwa saya memiliki cap waktu dalam milidetik. Potong 3 digit terakhir, dan Anda mendapatkan waktu yang akurat
Stewart

64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Dimana angka dibelakang @adalah angka dalam hitungan detik


28
Di OSX 10.8, ini date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) atau sederhananyadate -r 1278999698
Tom McKenzie

Bekerja untuk Ubuntu 16.04
Mike Q

24

Solusi ini berfungsi dengan versi tanggal yang tidak mendukung date -d @. Itu tidak membutuhkan AWK atau perintah lainnya. Stempel waktu Unix adalah jumlah detik sejak 1 Jan 1970, UTC, jadi penting untuk menentukan UTC.

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

Jika Anda menggunakan Mac, gunakan:

date -r 1357004952

Perintah untuk mendapatkan epoch:

date +%s
1357004952

Kredit diberikan kepada Anton: BASH: Ubah Stempel Waktu Unix menjadi Tanggal


10

Seperti yang dikatakan @TomMcKenzie dalam komentar untuk jawaban lain, date -r 123456789ini bisa dibilang solusi sederhana yang lebih umum (yaitu lebih banyak diterapkan) untuk waktu yang diberikan sebagai detik sejak Unix Epoch, tetapi sayangnya tidak ada solusi portabel yang dijamin universal.

The -dpilihan pada banyak jenis sistem berarti sesuatu yang sama sekali berbeda dari GNU Date --dateekstensi. Sayangnya Tanggal GNU tidak ditafsirkan -rsama dengan implementasi lainnya. Jadi sayangnya Anda harus tahu versi mana yang dateAnda gunakan, dan banyak dateperintah Unix yang lebih lama tidak mendukung opsi mana pun.

Lebih buruk lagi, POSIX datetidak mengenali -datau -rdan tidak menyediakan cara standar dalam perintah apa pun (yang saya ketahui) untuk memformat waktu Unix dari baris perintah (karena POSIX Awk juga kekurangan strftime()). (Anda tidak dapat menggunakan touch -tdan lskarena yang pertama tidak menerima waktu yang diberikan sebagai detik sejak Unix Epoch.)

Perhatikan meskipun The One True Awk tersedia langsung dari Brian Kernighan sekarang memiliki strftime()fungsi built-in serta systime()fungsi untuk mengembalikan waktu saat ini dalam hitungan detik sejak Unix Epoch), jadi mungkin solusi Awk adalah yang paling portabel.


4

Jika Anda merasa notasinya canggung, mungkin -Ropsi-bisa membantu. Ini melebihi tanggal dalam format RFC 2822. Jadi Anda tidak perlu semua pengenal mereka: date -d @1278999698 -R. Kemungkinan lain adalah untuk output tanggal dalam detik di tempat Anda: date -d @1278999698 +%c. Harus mudah diingat. :-)


2

Koreksi sedikit untuk jawaban dabest1 di atas. Tentukan zona waktu sebagai UTC, bukan GMT:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

Yang kedua benar. Saya pikir alasannya adalah bahwa di Inggris, pergeseran waktu siang hari berlaku terus menerus dari tahun 1968 hingga 1971.


2

Solusi Perl standar adalah:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(atau waktu lokal, jika disukai)


1
awk 'BEGIN { print strftime("%c", 1271603087); }'

1

Contoh lain di sini sulit untuk diingat. Paling sederhana:

date -r 1305712800

Hasil campuran: tidak bekerja di ubuntu Linux tetapi bekerja di Mac OS X misalnya.
Mike Q

1

Letakkan yang berikut ini di ~ / .bashrc Anda:

function unixts() { date -d "@$1"; }

Contoh penggunaan:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

-1

Python:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
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.