Hitung Hari Sejak 1/1/1970

10

Bagaimana Anda bisa menghitung jumlah hari sejak 1/1/1970? Ini untuk memperbarui atribut shadowLastChange di OpenLDAP.

Apakah ada cara untuk melakukan ini menggunakan perintah tanggal linux ?

nitin
sumber
Dalam Bash dan sebagian besar shell Bourne-turunan modern, $()lebih disukai daripada backticks untuk keterbacaan dan alasan lainnya . echo $(( $(date ...) / 86400 ))
Dijeda sampai pemberitahuan lebih lanjut.
Belum punya 2000 ... bisakah seseorang mengedit dan memperbaiki judul :-)
Ring Ø

Jawaban:

20

ring0 mengalahkan saya beberapa detik, tetapi perintah lengkapnya adalah:

echo $(($(date --utc --date "$1" +%s)/86400))

Ini berlaku waktu UTC. Hasil:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

Pemeriksaan cepat dengan WolframAlpha menunjukkan bahwa ini adalah nilai yang benar.

Dave Drager
sumber
1
bagaimana dengan detik kabisat? :)
netvope
1
@netvope Setelah lompatan kedua, waktu unix diatur ulang oleh satu lagi. Jadi setiap hari menambahkan persis 86400 detik unix. Namun, waktu unix 915148800 dapat berlaku untuk UTC 1998-12-31T23: 59: 60 dan 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski
9

The dateperintah dapat memberikan jumlah detik sejak 1970-01-01 00:00:00 UTC.

  date +"%s"

Anda dapat membagi hasilnya dengan 3600*24mendapatkan jumlah hari (UTC).

Misalnya di Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

untuk menampilkan jumlah hari.

Dering Ø
sumber
9

Saya pikir ini adalah metode paling sederhana:

expr $(date +%s) / 86400
Kuda hitam
sumber
Mengapa ini diturunkan? Ini jawaban terbaik dan terpendek dan paling sederhana
Tom Corelis
1

Saya perlu menyelesaikan ini juga, tetapi saya ingin mendapatkan nilai yang sama untuk hari # terlepas dari waktu hari. Dengan pendekatan seperti yang ditunjukkan di sini, nilainya akan berubah pada tengah malam UTC dan bukan tengah malam waktu setempat. Ini sepertinya kurang dari masalah di UE atau Pantai Timur AS, yang cukup dekat dengan UTC sehingga nilai hari tidak akan berubah di tengah hari kerja biasa, tetapi di, misalnya, California, perubahan hari akan terjadi pukul 4 sore PST, yang mungkin tidak nyaman. Saya membayangkan orang Australia akan sangat terganggu karena perubahan nilai hari di pagi hari.

Jika kita ingin memperbaikinya, kita perlu menambahkan offset dari UTC sebelum membaginya dengan detik / hari. Untungnya, perintah tanggal Linux menyertakan urutan format % z yang melaporkan offset dari UTC. Sedangkan format standar (hasil ini adalah untuk waktu Denver, MDT):

$ date +%z
-0600

. . . tidak dapat langsung digunakan dalam perhitungan, pengubah yang tepat akan menghasilkan apa yang kita inginkan:

$ date +%-:::z
-6

Masukkan itu bersama dengan konversi detik / jam / hari yang biasa, dan saya yakin yang berikut ini akan menghasilkan hari-hari sejak 1/1/1970, dengan 1/1/1970 itu sendiri menjadi hari nol, dan nilainya bertambah pada tengah malam waktu setempat:

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

Perhitungan sederhana ini tidak akan berfungsi untuk zona waktu yang tidak diimbangi dari UTC oleh seluruh jam (misalnya, India, TZ = Asia / Kolkata), karena date +%-:::zkesalahan "+5: 30" yang dihasilkan oleh akan menghasilkan kesalahan "karakter tidak valid dalam ekspresi" bila digunakan dalam pernyataan di atas.

oracleif
sumber