Saya sering ingin membuat beberapa perhitungan tanggal cepat, seperti:
- Apa perbedaan antara kedua tanggal ini?
- Apa tanggal dan minggu setelah tanggal lainnya?
Saya biasanya membuka kalender dan menghitung hari, tetapi saya pikir harus ada program / skrip yang dapat saya gunakan untuk melakukan perhitungan semacam ini. Ada saran?
Jawaban:
"N minggu setelah kencan" mudah dengan tanggal GNU (1):
Saya tidak tahu cara sederhana untuk menghitung perbedaan antara dua tanggal, tetapi Anda dapat membungkus sedikit logika sekitar tanggal (1) dengan fungsi shell.
Tukar
d1
dand2
jika Anda menginginkan perhitungan tanggal dengan cara lain, atau dapatkan pemain yang lebih menarik untuk membuatnya tidak masalah. Lebih lanjut, jika ada transisi non-DST ke DST dalam interval, satu hari hanya akan panjang 23 jam; Anda dapat menggantinya dengan menambahkan ½ hari ke jumlah.sumber
Untuk satu set alat portabel coba dateutils saya sendiri . Dua contoh Anda akan menjadi satu baris:
atau dalam beberapa minggu dan hari:
dan
sumber
dateadd -i '%m%d%Y' 01012015 +1d
tampaknya tidak berfungsi, itu hanya menggantung di sana tanpa batas waktu ... itu berfungsi jika spesifikasi tanggal dipisahkan oleh char, ada char ... ada ide apa yang salah?)Contoh python untuk menghitung jumlah hari saya berjalan di planet ini:
sumber
ychaouche@ychaouche-PC ~ $ python -c "from datetime import date as d; print (d.today() - d(1980, 6, 14)).days"
12813
ychaouche@ychaouche-PC ~ $
Saya biasanya lebih suka memiliki waktu / tanggal dalam format utime unix (jumlah detik sejak zaman, ketika tujuh puluhan dimulai, UTC). Dengan cara itu selalu bermuara pada pengurangan atau penambahan detik.
Masalahnya biasanya mengubah tanggal / waktu menjadi format ini.
Dalam lingkungan shell / skrip Anda bisa mendapatkannya dengan
date '+%s'
Pada saat penulisan, waktu saat ini adalah1321358027
.Untuk membandingkan dengan 2011-11-04 (ulang tahun saya)
date '+%s' -d 2011-11-04
,, menghasilkan1320361200
. Kurangi:expr 1321358027 - 1320361200
beri996827
detik, yaituexpr 996827 / 86400
= 11 hari yang lalu.Mengubah dari utime (format 1320361200) menjadi tanggal sangat mudah dilakukan misalnya C, PHP atau perl, menggunakan pustaka standar. Dengan GNU
date
,-d
argumennya dapat diawali dengan@
untuk menunjukkan format "Detik sejak Zaman".sumber
date -d @1234567890
konversi dari detik sejak zaman ke format tanggal apa pun yang Anda tentukan.info date
, terutama Detik sejak node Epoch : "Jika Anda mendahului nomor dengan` @ ', itu mewakili cap waktu internal sebagai hitungan detik. "Jika alat grafis OK untuk Anda, saya sungguh-sungguh merekomendasikan
qalculate
(kalkulator dengan penekanan pada konversi unit, ia dilengkapi dengan antarmuka GTK dan KDE, IIRC). Di sana Anda bisa mengatakan misalnyauntuk mendapatkan jumlah hari (140, sejak 1900 bukan tahun kabisat) antara tanggal, tetapi tentu saja Anda juga dapat melakukan hal yang sama untuk kali:
menghasilkan
8.4591667
jam atau, jika Anda mengatur output ke format waktu8:27:33
,.sumber
qalc
begituhelp days
.qcalc
contoh:qalc -t 'days(1900-05-21, 1900-01-01)'
-> 140Ini muncul ketika menggunakan
date -d "$death_date - $y years - $m months - $d days"
untuk mendapatkan tanggal lahir (untuk silsilah). Perintah itu SALAH. Bulan tidak semuanya sama, jadi(date + offset) - offset != date
. Usia, dalam tahun / bulan / hari, adalah langkah maju dari tanggal lahir.Date memberikan output yang benar dalam kedua kasus, tetapi dalam kasus kedua Anda menanyakan pertanyaan yang salah. Itu penting YANG 11 bulan dalam setahun dari penutup +/- 11, sebelum menambah / mengurangi hari. Sebagai contoh:
Untuk mengurangi menjadi operasi terbalik dari penambahan, urutan operasi harus dibalik. Menambahkan menambahkan tahun, MAKA bulan, MAKA hari. Jika mengurangi menggunakan urutan yang berlawanan, maka Anda akan kembali ke titik awal Anda. Tidak, jadi Anda tidak, jika hari offset melintasi batas bulan di bulan panjang yang berbeda.
Jika Anda perlu bekerja mundur dari tanggal dan usia akhir, Anda dapat melakukannya dengan beberapa pemanggilan
date
. Pertama kurangi hari, lalu bulan, lalu tahun. (Saya pikir tidak aman untuk menggabungkan tahun dan bulan dalam satudate
doa tunggal , karena tahun kabisat mengubah panjang Februari.)sumber
Cara lain untuk menghitung perbedaan antara dua tanggal pada tahun kalender yang sama Anda bisa menggunakan ini:
date
ke variabel DATEfirstnum. The-d
bendera menampilkan string dalam format waktu dalam hal ini 14 Mei 2014 dan+"%j"
memberitahudate
untuk memformat output untuk hanya hari tahun (1-365).DAYSdif
pada perbedaan dua hari.DAYSdif
.Ini berfungsi dengan versi GNU
date
, tetapi tidak pada versi PC-BSD / FreeBSD. Saya menginstalcoreutils
dari port ports dan menggunakan perintah/usr/local/bin/gdate
sebagai gantinya.sumber
DATEfirstnum=$(date -d "$1" +%s)
DATElastnum=$(date -d "$2" +%s)
Juga, skrip ini tidak akan dapat menghitung perbedaan antara dua tahun yang berbeda.+%j
mengacu pada hari tahun (001..366) sehingga./date_difference.sh 12/31/2001 12/30/2014
output -1. Seperti jawaban lain yang dicatat, Anda perlu mengubah kedua tanggal menjadi detik sejak 1970-01-01 00:00:00 UTC.$
di dalam ekspresi aritmatika:$((DATElastnum - DATEfirstnum))
juga akan berfungsi.Saya sering menggunakan SQL untuk perhitungan tanggal. Misalnya MySQL , PostgreSQL atau SQLite :
Lain kali saya hanya merasa ingin untuk JavaScript. Misalnya SpiderMonkey , WebKit , Seed atau Node.js :
(Awas saat melewati bulan ke
Date
konstruktor objek JavaScript . Mulai dengan 0.)sumber
Dengan bantuan solusi dannas ini dapat dilakukan dalam satu baris dengan kode berikut:
(Bekerja di Python 2.x dan Python 3.)
sumber
date
dan bash dapat melakukan perbedaan tanggal (opsi OS X ditampilkan). Tempatkan tanggal yang terakhir lebih dulu.sumber
Ada juga perhitungan waktu unit GNU yang dikombinasikan dengan tanggal GNU:
(gunits adalah unit di Linux, gdate adalah tanggal)
sumber
datediff.sh di github: gist
sumber
jawaban camh menangani sebagian besar dari itu, tetapi kita dapat meningkatkan untuk berurusan dengan pembulatan, zona waktu, dll, ditambah kita mendapatkan beberapa presisi ekstra dan kemampuan untuk memilih unit kami:
-d
memberi tahudate
bahwa kami menyediakan tanggal untuk dikonversi.+%s.%N
mengubah tanggal-waktu ke detik.nanoseconds sejak 1970-01-01 00:00:00 UTC.bc
menghitung perbedaan antara dua angka, dan faktor pembagian memberi kita unit yang berbeda.printf
menambahkan 0 sebelum tempat desimal jika diperlukan (bc
tidak) dan memastikan pembulatan pergi ke terdekat (bc
hanya terpotong). Anda juga bisa menggunakannyaawk
.Sekarang mari kita jalankan ini dengan test case yang funky,
Perhatikan bahwa karena panjang bulan atau tahun tidak selalu sama, tidak ada jawaban "benar" di sana, meskipun orang dapat menggunakan 365,24 hari sebagai perkiraan yang masuk akal saat ini.
sumber
Anda dapat menggunakan perpustakaan Velk awk :
Atau:
Hasil:
sumber