Saya memiliki skrip shell yang berjalan di Linux dan menggunakan panggilan ini untuk mendapatkan tanggal kemarin dalam YYYY-MM-DD
format:
date -d "1 day ago" '+%Y-%m-%d'
Ini berfungsi sebagian besar waktu, tetapi ketika skrip berlari kemarin pagi 2013-03-11 0:35 CDT
itu kembali "2013-03-09"
bukan "2013-03-10"
.
Agaknya waktu musim panas (yang dimulai kemarin) harus disalahkan. Saya kira cara "1 day ago"
ini diterapkan dikurangi 24 jam, dan 24 jam sebelumnya 2013-03-11 0:35 CDT
adalah 2013-03-09 23:35 CST
, yang menyebabkan hasil "2013-03-09"
.
Jadi apa cara aman-DST yang baik untuk mendapatkan kencan kemarin di bash di Linux?
Jawaban:
Saya pikir ini harus berhasil, terlepas dari seberapa sering dan kapan Anda menjalankannya ...
sumber
date -d yesterday 13:00 -I
tanggal di bawah Mac OSX sedikit berbeda.
Untuk kemarin
Untuk minggu lalu
sumber
gdate
, tersedia dalamcoreutils
paket homebrew .date
berbeda.Ini juga bisa berhasil, tetapi mungkin terlalu banyak:
sumber
date
yang tidak mendukungyesterday
sintaks ...Jika Anda yakin skrip berjalan pada jam-jam pertama hari itu, Anda bisa melakukannya
BTW, jika skrip berjalan setiap hari pada 00:35 (melalui crontab?) Anda harus bertanya pada diri sendiri apa yang akan terjadi jika perubahan DST jatuh pada jam itu; skrip tidak dapat berjalan, atau dijalankan dua kali dalam beberapa kasus. Implementasi modern
cron
yang cukup pintar dalam hal ini, meskipun.sumber
kamu bisa memakai
untuk mendapatkan tanggal dari 30 hari yang lalu, Anda juga dapat mengganti 30 dengan jumlah x hari
sumber
%Y%m%d
agar sesuai dengan pertanyaan. Saya tetap terpilih karena berfungsi dengan baik.Di sini solusi yang akan bekerja dengan Solaris dan AIX juga.
Memanipulasi Zona Waktu dimungkinkan untuk mengubah jam beberapa jam. Karena waktu musim panas, 24 jam yang lalu bisa jadi hari ini atau sehari sebelum kemarin.
Anda yakin kemarin 20 atau 30 jam yang lalu. Yang mana? Nah, yang terbaru bukan hari ini.
Parameter -e yang digunakan dalam perintah echo diperlukan dengan bash, tetapi tidak akan bekerja dengan ksh. Di ksh Anda dapat menggunakan perintah yang sama tanpa tanda -e.
Saat skrip Anda akan digunakan di lingkungan yang berbeda, Anda dapat memulai skrip dengan #! / Bin / ksh atau #! / Bin / bash. Anda juga dapat mengganti \ n dengan baris baru:
sumber
Cukup gunakan
date
dan percayai detik:Seperti yang Anda tunjukkan dengan benar, banyak detail tentang perhitungan yang mendasarinya disembunyikan jika Anda mengandalkan aritmatika waktu bahasa Inggris. Misalnya
-d yesterday
, dan-d 1 day ago
akan memiliki perilaku yang berbeda.Sebagai gantinya, Anda dapat bergantung pada detik (didokumentasikan dengan tepat) sejak unix epoch UTC, dan bash aritmatika untuk mendapatkan momen yang Anda inginkan:
Ini ditunjukkan dalam jawaban lain . Formulir ini lebih portabel di semua platform dengan
date
bendera baris perintah yang berbeda , tidak tergantung pada bahasa (misalnya "kemarin" vs "hier" di lokal Prancis), dan terus terang (dalam jangka panjang) akan lebih mudah diingat, karena Anda juga sudah tahu itu. Anda mungkin terus bertanya pada diri sendiri: "Apakah itu-d 2 hours ago
atau-d 2 hour ago
lagi?" atau "Apakah itu-d yesterday
atau-d 1 day ago
yang saya inginkan?"). Satu-satunya yang sulit di sini adalah@
.Berbekal bash dan tidak ada yang lain:
Bash hanya dengan bash, Anda juga bisa mendapatkan waktu kemarin, melalui printf builtin:
Begitu,
atau, ekuivalen dengan variabel temp (subshell luar opsional, tetapi menjaga kebersihan lingkungan).
Catatan: meskipun halaman manual menyatakan bahwa tidak ada argumen ke
%()T
formatter akan menganggap default-1
, saya tampaknya mendapatkan 0 sebagai gantinya (terima kasih, bash manual versi 4.3.48)sumber
Untuk menggunakan ini nanti:
sumber
Kamu bisa memakai:
Atau kapan pun Anda ingin mengambil akan diambil dengan bash.
Untuk bulan:
sumber
Saat pertanyaan ini ditandai pesta "DST aman"
Dan menggunakan garpu untuk
date
memerintahkan penundaan implikasi, ada cara sederhana dan lebih efisien menggunakan bash murni bawaan :Ini adalah jauh lebih cepat pada sistem lebih ramah daripada harus garpu untuk
date
.Dari pestaV> = 5.0 , ada variabel baru
$EPOCHSECONDS
sumber