Dateutils adalah sekumpulan alat yang berkisar pada mengutak-atik tanggal dan waktu pada baris perintah dengan fokus kuat pada kasus penggunaan yang muncul ketika menangani data keuangan dalam jumlah besar.
Dateutils dihosting terutama di github:
halaman github: https://github.com/hroptatyr/dateutils
beranda proyek: http://www.fresse.org/dateutils/
unduhan: https://bitbucket.org/hroptatyr/dateutils/downloads
Di bawah ini adalah daftar singkat contoh yang menunjukkan apa yang dapat dilakukan dateutils, untuk spesifikasi lengkap lihat info dan halaman manual. Untuk petunjuk instalasi lihat file INSTALL.
Perintah Dateutils diawali dengan date
tetapi menyerupai perintah unix yang dikenal karena alasan intuisi. Satu-satunya pengecualian adalah strptime
yang analog dengan fungsi libc dengan nama yang sama.
strptime
Versi baris perintah dari fungsi C
dateadd
Tambahkan durasi ke tanggal atau waktu
dateconv
Mengonversi tanggal atau waktu antar kalender
datediff
Hitung durasi antara tanggal atau waktu
dategrep
Grep tanggal atau waktu di aliran input
dateround
Membulatkan tanggal atau waktu ke nilai yang "lebih lengkap".
dateseq
Menghasilkan urutan tanggal atau waktu
datesort
Urutkan secara kronologis.
datetest
Bandingkan tanggal atau waktu
datezone
Ubah tanggal/waktu menjadi zona waktu secara massal
Saya suka semua yang dijelaskan dengan contoh untuk mendapatkan kesan pertama. Jadi ini dia.
Alat yang meniru seq(1) tetapi masukannya berasal dari domain tanggal, bukan bilangan bulat. Biasanya skrip menggunakan sesuatu seperti
$ for i in $(seq 0 9); do date -d "2010-01-01 +${i} days" "+%F" done
yang sekarang dapat disingkat menjadi
$ dateseq 2010-01-01 2010-01-10
dengan manfaat tambahan bahwa tanggal akhir dapat diberikan secara langsung alih-alih dihitung dari tanggal mulai dan selang waktu dalam hari. Selain itu, ia menyediakan fitur spesifik tanggal yang akan menjadi PITA untuk diimplementasikan menggunakan pendekatan seq(1)/date(1) di atas, seperti melewatkan hari kerja tertentu:
$ dateseq 2010-01-01 2010-01-10 --skip sat,sun => 2010-01-01 2010-01-04 2010-01-05 2010-01-06 2010-01-07 2010-01-08
dateseq juga berfungsi pada waktu:
$ dateseq 12:00:00 5m 12:17:00 => 12:00:00 12:05:00 12:10:00 12:15:00
dan juga tanggal-waktu:
$ dateseq --compute-from-last 2012-01-02T12:00:00 5m 2012-01-02T12:17:00 => 2012-01-02T12:02:00 2012-01-02T12:07:00 2012-01-02T12:12:00 2012-01-02T12:17:00
Alat untuk mengonversi tanggal antara sistem kalender dan/atau zona waktu yang berbeda. Meskipun alat serupa lainnya biasanya berfokus pada konversi tanggal Gregorian menjadi, misalnya, kalender Tiongkok, dconv bertujuan untuk mendukung sistem kalender yang penting dalam konteks keuangan.
Untuk mengubah tanggal (Gregorian) menjadi representasi ymcw:
$ dateconv 2012-03-04 -f "%Y-%m-%c-%w" => 2012-03-01-00
dan sebaliknya:
$ dateconv 2012-03-01-Sun -i "%Y-%m-%c-%a" -f '%F' => 2012-03-04
dimana representasi ymcw berarti %c
-th %w
pada bulan pada tahun tertentu. Ini berguna jika tanggal ditentukan seperti, Kamis ketiga di bulan Mei misalnya.
dateconv juga dapat digunakan untuk mengonversi kemunculan tanggal, waktu, atau tanggal-waktu dalam aliran input dengan cepat
$ dateconv -S -i '%b/%d %Y at %I:%M %P' <<EOF Remember we meet on Mar/03 2012 at 02:30 pm EOF => Remember we meet on 2012-03-03T14:30:00
dan yang paling menonjol untuk mengkonversi antar zona waktu:
$ dateconv --from-zone "America/Chicago" --zone "Asia/Tokyo" 2012-01-04T09:33:00 => 2012-01-05T00:33:00 $ dateconv --zone "America/Chicago" now -f "%d %b %Y %T" => 05 Apr 2012 11:11:57
Alat untuk melakukan perbandingan tanggal di shell, dimodelkan setelah test(1)
tetapi dengan opsi baris perintah yang tepat.
$ if datetest today --gt 2010-01-01; then echo "yes" fi => yes
Alat untuk melakukan aritmatika tanggal (matematika tanggal) di shell. Dengan adanya tanggal dan daftar durasi, ini akan menghitung tanggal baru. Mengingat durasi dan daftar tanggal, ini akan menghitung tanggal baru.
$ dateadd 2010-02-02 +4d => 2010-02-06 $ dateadd 2010-02-02 +1w => 2010-02-09 $ dateadd -1d <<EOF 2001-01-05 2001-01-01 EOF => 2001-01-04 2000-12-31
Menambahkan durasi ke waktu:
$ dateadd 12:05:00 +10m => 12:15:00
dan bahkan tanggal-waktu:
$ dateadd 2012-03-12T12:05:00 -1d4h => 2012-03-11T08:05:00
Jika didukung oleh basis data zoneinfo sistem, penghitungan penyesuaian detik kabisat dapat dilakukan. Gunakan satuan rs
untuk menunjukkan detik "nyata":
$ dateadd '2012-06-30 23:59:30' +30rs => 2012-06-30T23:59:60
sebagai lawan dari:
$ dateadd '2012-06-30 23:59:30' +30s => 2012-07-01T00:00:00
Alat untuk menghitung selisih antara dua (atau lebih) tanggal. Ini adalah kebalikan dari ayah. Outputnya adalah durasi yang, bila ditambahkan ke tanggal pertama, menghasilkan tanggal kedua.
Dapatkan jumlah hari antara dua tanggal:
$ datediff 2001-02-08 2001-03-02 => 22
Format durasi dapat dikontrol melalui tombol -f
:
$ datediff 2001-02-08 2001-03-09 -f "%m month and %d day" => 1 month and 1 day
dateiff juga menerima stempel waktu sebagai masukan:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 => 92580s
Sakelar -f
melakukan hal yang benar:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Ss' => 1d 6180s
bandingkan dengan:
$ datediff 2012-03-01T12:17:00 2012-03-02T14:00:00 -f '%dd %Hh %Ss' => 1d 1h 2580s
Jika didukung oleh basis data zoneinfo sistem perhitungan penyesuaian detik kabisat dapat dilakukan. Gunakan penentu format %rS
untuk mendapatkan waktu yang berlalu dalam detik "nyata":
datediff '2012-06-30 23:59:30' '2012-07-01 00:00:30' -f '%rS' => 61
Alat untuk mengekstrak garis dari aliran masukan yang cocok dengan kriteria tertentu, menampilkan garis atau kecocokan:
$ dategrep '<2012-03-01' <<EOF Feb 2012-02-28 Feb 2012-02-29 leap day Mar 2012-03-01 Mar 2012-03-02 EOF => Feb 2012-02-28 Feb 2012-02-29 leap day
Alat untuk "membulatkan" tanggal atau stempel waktu ke titik waktu yang berulang, seperti Januari berikutnya/sebelumnya atau Kamis berikutnya/sebelumnya.
Pembulatan (mundur) ke tanggal satu bulan ini:
$ dateround '2011-08-22' -1 => 2011-08-01
Temukan hari Senin berikutnya dari tanggal saat ini (hari ini 08-01-2016):
$ dateround today Mon => 2015-01-11
Kembali ke bulan September lalu, lalu dibulatkan ke akhir bulan:
$ dateround today -- -Sep +31d => 2015-09-30
Bulatkan aliran tanggal secara ketat ke tanggal satu bulan berikutnya:
$ dateround -S -n 1 <<EOF pay cable 2012-02-28 pay gas 2012-02-29 pay rent 2012-03-01 redeem loan 2012-03-02 EOF => pay cable 2012-03-01 pay gas 2012-03-01 pay rent 2012-04-01 redeem loan 2012-04-01
Bulatkan rangkaian waktu ke menit berikutnya (yaitu bagian detiknya adalah 00) dan kemudian ke waktu paruh berikutnya (dan konversikan ke ISO):
$ dateround -S 0s30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:30:00 eventB
Alternatifnya, jika Anda membagi hari menjadi setengah jam, Anda dapat membulatkannya ke salah satu jam tersebut menggunakan notasi kelas bersama:
$ dateround -S /30m -i '%d/%m/%Y %T' -f '%F %T' <<EOF 06/03/2012 14:27:12 eventA 06/03/2012 14:29:59 eventA 06/03/2012 14:30:00 eventB 06/03/2012 14:30:01 eventB EOF => 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventA 2012-03-06 14:30:00 eventB 2012-03-06 15:00:00 eventB
Hal ini sebagian besar identik dengan contoh sebelumnya, kecuali satu jam penuh (yang merupakan kelipatan setengah jam) adalah kemungkinan target pembulatan.
Alat untuk menyusun baris-baris file ke dalam urutan kronologis.
Saat ini alat datesort
bergantung pada sort(1)
dengan dukungan untuk bidang, khususnya -t
untuk memilih pemisah dan -k
untuk mengurutkan berdasarkan bidang tertentu.
$ datesort <<EOF 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" EOF => 2009-06-03 caev="DVCA" secu="VOD" exch="XLON" xdte="2009-06-03" nett/GBX="5.2" 2010-11-17 caev="DVCA" secu="VOD" exch="XLON" xdte="2010-11-17" nett/GBX="2.85" 2011-11-16 caev="DVCA" secu="VOD" exch="XLON" xdte="2011-11-16" nett/GBX="3.05" 2012-06-06 caev="DVCA" secu="VOD" exch="XLON" xdte="2012-06-06" nett/GBX="6.47" 2013-06-12 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-06-12" nett/GBX="6.92" 2013-11-20 caev="DVCA" secu="VOD" exch="XLON" xdte="2013-11-20" nett/GBX="3.53"
Alat untuk memeriksa nilai tanggal/waktu dengan cepat di zona waktu yang berbeda. Hasilnya akan berupa matriks yang menampilkan setiap nilai tanggal-waktu di setiap zona waktu:
$ datezone Europe/Berlin Australia/Sydney now 2014-06-30T05:00:00 => 2014-01-30T17:37:13+01:00 Europe/Berlin 2014-01-31T03:37:13+11:00 Australia/Sydney 2014-06-30T07:00:00+02:00 Europe/Berlin 2014-06-30T15:00:00+10:00 Australia/Sydney
Alat datezone
juga dapat digunakan untuk mendapatkan transisi DST berikutnya atau sebelumnya relatif terhadap tanggal/waktu tertentu:
$ datezone --next Europe/Berlin Australia/Sydney 2013-02-19 => 2013-03-31T02:00:00+01:00 -> 2013-03-31T03:00:00+02:00 Europe/Berlin 2013-04-07T03:00:00+11:00 -> 2013-04-07T02:00:00+10:00 Australia/Sydney
di mana stempel waktu kiri menunjukkan offset zona saat ini dan sisi kanan adalah offset zona setelah transisi. Tanggal/waktu menunjukkan saat yang tepat kapan transisi akan terjadi.
Intinya datezone
adalah zdump(8)
yang lebih baik.
Alat yang menghadirkan fleksibilitas strptime(3)
ke baris perintah. Meskipun (setidaknya GNU) date(1)
memiliki dukungan untuk format keluaran, ia tidak memiliki dukungan apa pun untuk membaca masukan sewenang-wenang dari domain tanggal, khususnya ketika format masukan telah diketahui secara spesifik sebelumnya dan hanya tanggal/waktu yang cocok yang boleh digunakan. dipertimbangkan.
Dengan alat strptime
yang membaca tanggal-tanggal aneh seperti Mon, May-01/2000
menjadi soal
strptime -i "%a, %b-%d/%Y" "Mon, May-01/2000" => 2000-05-01
seperti yang akan Anda lakukan di C.
Perhatikan bahwa strptime
sebenarnya menggunakan rutinitas strptime sistem libc, dan untuk keluaran rutinitas strftime sistem. Oleh karena itu, pengubah input dan output akan bervariasi antar sistem.
Untuk kombinasi parser/printer portabel, gunakan dateconv
seperti dijelaskan di atas. Penentu format input dan outputnya tidak bergantung pada runtime C.
Tanpa urutan tertentu dan tanpa klaim kelengkapan apa pun:
tanggalexpr: http://www.eskimo.com/~scs/src/#dateexpr
dateutils allanfalloon: https://github.com/alanfalloon/dateutils
ya http://yest.sourceforge.net/
pdd https://github.com/jarun/pdd
Gunakan salah satu yang paling sesuai dengan tujuan Anda. Dan jika Anda menyukai milik saya, pilih: halaman openhub dateutils