Saya ingin menulis naskah atau fungsi untuk memberi tahu saya berapa hari dari sekarang sampai tanggal tertentu di masa depan. Yang saya perjuangkan adalah bagaimana memproses tanggal yang diberikan dan membandingkannya dengan tanggal saat ini ... Saya membayangkan sesuatu seperti
read -p "enter the date in the format YYYY-MM-DD "
Dan kemudian saya berasumsi saya memiliki string yang tidak berarti bagi shell dan saya harus melakukan beberapa evaluasi seperti ... ?? (Ini hanya sebuah contoh; Saya kira bc
akan dibutuhkan)
i=$(($(date +%Y)-${REPLY%%-*}))
j=$(($(date +%m)-${REPLY:5:2}))
k=$(($(date +%d)-${REPLY##*-}))
Dan kemudian saya tidak tahu apa yang harus dilakukan dengan angka-angka itu ... ??
if $i > 1 then assign l=$((i*365)) and else what?? # what about leap years?
Using $j somehow assign m # confused before I've started
Using $k somehow assign n # just as bad
echo $((l+m+n))
Saya pasti membuatnya terlalu sulit untuk diri saya sendiri; mungkin ada alat pemrosesan teks yang memahami tanggal dan dapat membandingkannya.
Bagaimana saya bisa melakukan ini?
Jawaban:
Waktu zaman
Secara umum, perhitungan waktu paling mudah jika kita pertama kali mengubah waktu menjadi (Unix) waktu zaman (detik dari 1-1-1970). Dengan python, kita memiliki alat untuk mengubah waktu menjadi waktu, dan kembali ke format tanggal yang kita inginkan.
Kami cukup mengatur format, seperti:
... dan tentukan hari ini:
dan kemudian menulis fungsi untuk melakukan pekerjaan:
Maka output dari:
... yang, sebagaimana disebutkan, jumlah detik sejak 1-1-1970
Menghitung hari antara dua tanggal
Jika kita melakukan ini pada hari ini dan tanggal masa depan kita, kemudian hitung selisihnya:
Output akan dihitung berdasarkan tanggal , karena kami menggunakan format
%Y-%m-%d
. Membulatkan detik mungkin akan memberikan perbedaan tanggal yang salah, jika kita hampir 24 jam misalnya.Versi terminal
... Dan opsi Zenity
Dan hanya untuk bersenang-senang ...
Aplikasi kecil. Tambahkan ke jalan pintas jika Anda sering menggunakannya.
Naskah:
orangedays.py
Menjalankannya:
Untuk membungkusnya
Gunakan untuk skrip aplikasi kecil di atas
.desktop
file berikut :orangedays.desktop
dalam~/.local/share/applications
Dalam barisan
setel jalur aktual ke skrip ...
sumber
The GNU
date
utilitas cukup baik di hal semacam ini. Ia mampu mem-parsing beragam format tanggal yang baik dan kemudian output dalam format lain. Di sini kita gunakan%s
untuk menampilkan jumlah detik sejak zaman. Maka masalah aritmatika sederhana untuk dikurangkan$now
dari$future
dan dibagi dengan 86400 detik / hari:sumber
-u
parameter kedate
.Anda dapat mencoba melakukan sesuatu
awk
, menggunakanmktime
fungsinyaAwk mengharapkan untuk membaca tanggal dari input standar dalam format "YYYY MM DD HH MM SS" dan kemudian mencetak perbedaan antara waktu yang ditentukan dan waktu saat ini dalam beberapa hari.
mktime
cukup mengonversi waktu (dalam format yang ditentukan) ke jumlah detik dari waktu referensi (1970-01-01 00:00:00 UTC); systime simple menentukan waktu saat ini dalam format yang sama. Kurangi satu dari yang lain dan Anda mendapatkan seberapa jauh mereka dalam hitungan detik. Bagi dengan 86400 (24 * 60 * 60) untuk dikonversi menjadi hari.sumber
Ini adalah versi Ruby
Contoh Jalankan:
Contoh menjalankan skrip
ruby ./day-difference.rb
diberikan di bawah ini (dengan asumsi Anda telah menyimpannya sebagaiday-difference.rb
)Dengan tanggal di masa depan
Dengan tanggal yang dilewati
Ketika melewati tanggal hari ini
Berikut adalah situs web yang bagus untuk memeriksa perbedaan tanggal http://www.timeanddate.com/date/duration.html
sumber
Ada
dateutils
paket yang sangat nyaman untuk berurusan dengan tanggal. Baca lebih lanjut di sini github: dateutilsInstal dengan
sudo apt install dateutils
Untuk masalah Anda, cukup,
dateutils.ddiff <start date> <end date> -f "%d days"
di mana output dapat dipilih sebagai detik, menit, jam, hari, minggu, bulan atau tahun. Ini dapat dengan mudah digunakan dalam skrip di mana output dapat digunakan untuk tugas-tugas lain.
Sebagai contoh,
sumber
Anda dapat menggunakan perpustakaan Velk awk :
Atau:
sumber
Solusi singkat, jika kedua tanggal tersebut berasal dari tahun yang sama, adalah:
menggunakan format "% j", yang mengembalikan posisi tanggal dalam hari-hari dalam setahun, yaitu 135 untuk tanggal saat ini. Ini menghindari masalah pembulatan dan menangani tanggal di masa lalu, memberikan hasil negatif.
Namun, melewati batas tahun, ini akan gagal. Anda bisa menambahkan (atau mengurangi) 365 secara manual untuk setiap tahun atau 366 untuk setiap tahun kabisat, jika yang terakhir bulan Februari dilewati, tetapi itu hampir sama dengan solusi lainnya.
Di sini solusi bash murni:
Shellcheck menyarankan banyak mengutip ganda, tetapi untuk hari-hari melebihi tahun 9999 Anda harus mempertimbangkan pendekatan yang berbeda. Untuk masa lalu, akan gagal secara diam-diam untuk tanggal sebelum 1970.01.01. Membersihkan input pengguna dibiarkan sebagai latihan bagi pengguna.
Kedua fungsi tersebut dapat di refactored menjadi satu, tetapi itu mungkin membuatnya lebih sulit untuk dipahami.
Harap dicatat, bahwa skrip membutuhkan pengujian lengkap untuk menangani tahun kabisat di masa lalu dengan benar. Saya tidak akan bertaruh itu benar.
sumber