Jawaban:
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.
Saya pikir ini adalah metode paling sederhana:
expr $(date +%s) / 86400
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 +%-:::z
kesalahan "+5: 30" yang dihasilkan oleh akan menghasilkan kesalahan "karakter tidak valid dalam ekspresi" bila digunakan dalam pernyataan di atas.
$()
lebih disukai daripada backticks untuk keterbacaan dan alasan lainnya .echo $(( $(date ...) / 86400 ))