Apakah ada alat di Solaris UNIX (jadi tidak ada alat GNU tersedia) untuk mengurangi tanggal? Saya tahu bahwa di Linux kami memiliki gawk
yang dapat mengurangi satu tanggal dari yang lain. Tetapi dalam Solaris, maksimum yang kita miliki adalah nawk
(ditingkatkan awk
) yang tidak dapat melakukan perhitungan tanggal. Saya juga tidak bisa menggunakan perl.
Apakah ada cara untuk melakukan perhitungan tanggal seperti 20100909 - 20001010
?
UPDATE: Apakah bc
dapat melakukan perhitungan tanggal?
Jawaban:
Berikut ini adalah skrip awk yang baru saja saya tulis, harus berfungsi dengan awk POSIX. Anda harus mencoba versi Solaris; ingat bahwa ada dua versi Awk pada Solaris juga, satu di / bin dan satu di / usr / xpg4 / bin / awk (yang nawk, saya percaya).
Lewati string tanggal YYYYmmdd dan akan dikonversi ke jumlah detik sejak Zaman (dengan sedikit pemberian karena berada di batas hari). Maka Anda akan dapat mengurangi keduanya.
sumber
Sayangnya, tidak ada utilitas baris perintah POSIX yang menyediakan aritmatika pada tanggal.
date -d
dandate +%s
merupakan cara untuk pergi jika Anda memilikinya, tetapi itu adalah ekstensi GNU.Ada peretasan yang ceroboh dengan
touch
pekerjaan semacam itu untuk memeriksa apakah suatu kencan setidaknya n hari di masa lalu:(Perhatikan bahwa kode ini dapat dimatikan oleh satu jika DST mulai atau berhenti dalam interval dan skrip berjalan sebelum 01:00).
Beberapa orang akhirnya menerapkan perpustakaan manipulasi tanggal di Bourne atau POSIX shell. Ada beberapa contoh dan tautan di FAQ comp.unix.shell .
Menginstal alat-alat GNU mungkin merupakan cara yang paling tidak menyakitkan.
sumber
Saya akan mencoba menggunakan
date
perintah yang merupakan bagian dari POSIX sehingga hampir di mana-mana. UPDATE: Sayangnya, tampaknya -d bukan bagian dari tanggal POSIX dan kemungkinan tidak ada pada Solaris. Jadi ini kemungkinan tidak akan menjawab pertanyaan OP.Sekarang
d1
dand2
adalah bilangan bulat yang sesuai dengan detik sejak zaman unix. Jadi untuk mendapatkan perbedaan antara keduanya, kita kurangi ($((d1-d2))
dalam bash) dan terselubung ke unit apa pun yang kita inginkan. Hari adalah yang termudah:Cara melakukan konversi kemungkinan akan berbeda jika Anda tidak memiliki bash. Cara yang paling portabel adalah dengan menggunakan
expr
( halaman manual posix expr ).sumber
Sebagai catatan, dateutils adalah upaya saya untuk menyediakan satu set alat portabel yang mencakup aritmatika tanggal. Contoh Anda sampai
The
-i
menentukan format masukan.sumber
Perl kemungkinan akan diinstal, dan cukup mudah untuk mengambil modul dari CPAN , menginstalnya di direktori home Anda, dan merujuknya di program Anda. Dalam hal ini, modul Date :: Calc memiliki
Delta_Days
subrutin yang akan membantu.sumber
Tanggal GNU Wrt pada Solaris:
Saya mengatakan ini lagi:
Terlalu banyak Solaris SysAdmins bangga karena tidak menginstal paket resmi dari Sun (sekarang Oracle) yang membuat sistem Solaris "kompatibel dengan GNU" ketika mereka mengonfigurasi host baru. Mengalahkan saya mengapa.
Tanggal GNU luar biasa dan harus tersedia secara default pada host Solaris, IMHO.
Pada Solaris 10
Instal paket SFWcoreu dari CD Solaris Companion. Setelah menginstal Anda akan menemukan tanggal GNU di
/opt/sfw/bin/date
Pada Solaris 11
Anda mungkin sudah memilikinya karena saya percaya itu adalah bagian dari instalasi standar. Namun itu dipanggil
gdate
untuk membedakannya dari versi Sun tanggal.Lakukan ini jika tidak diinstal:
sumber
/usr/bin/gdate
dan/usr/gnu/bin/date
sehingga Anda dapat memilih untuk menggunakannya baik dengan nama atau dengan pengaturan PATH $.Jika Anda memiliki Python:
Anda menandai pertanyaan Anda "gawk" tetapi Anda mengatakan "tidak ada alat GNU". Gawk memiliki aritmatika tanggal.
sumber
python:
sumber
1. Tentukan format date1 dan date2 dalam
%j
hari tahun (001..366)2. Hitung perbedaannya dengan
expr
3. Jadi, jawabannya adalah 32 hari
... atau Solusi Satu Lapisan
atau
atau
sumber
Dengan tanggal BSD untuk macOS:
sumber
Anda dapat menggunakan perpustakaan Velk awk untuk mengembalikan perbedaan dalam hitungan detik:
Atau hari:
sumber