Bagaimana saya bisa mencetak tanggal yang merupakan hari sebelum waktu saat ini di Bash?
--date
atau -d
pilihan hanya tersedia di tanggal GNU
Bagaimana saya bisa mencetak tanggal yang merupakan hari sebelum waktu saat ini di Bash?
--date
atau -d
pilihan hanya tersedia di tanggal GNU
Jawaban:
jika Anda memiliki tanggal GNU dan saya mengerti Anda dengan benar
$ date +%Y:%m:%d -d "yesterday"
2009:11:09
atau
$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
date -v-1d
pada OSX (minus), -v+1d
(plus)
date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Jika Anda memiliki BSD (OSX) date
Anda dapat melakukannya seperti ini:
date -j -v-1d
Wed Dec 14 15:34:14 CET 2011
Atau jika Anda ingin melakukan perhitungan tanggal pada tanggal yang berubah-ubah:
date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
date --date='-1 day'
date: illegal option -- -
date
, tersedia melalui coreutils
paket, untuk membuat sintaks ini berfungsi di macOS. Jika Anda menggunakan Homebrew, Anda dapat menginstalnya melalui brew install coreutils
, setelah itu Anda harus dapat menggunakan tanggal GNU melalui gdate
perintah. Lihat: topbug.net/blog/2013/04/14/…
MAC OSX
Untuk tanggal kemarin:
date -v-1d +%F
di mana 1d mendefinisikan hari ini dikurangi 1 hari. Demikian pula,
date -v-1w +% F - untuk tanggal minggu sebelumnya
date -v-1m +% F - untuk tanggal bulan sebelumnya
JIKA ANDA MEMILIKI GNU DATE,
date --date="1 day ago"
Info lebih lanjut: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
date +%Y:%m:%d -d "yesterday"
Untuk detail tentang format tanggal, lihat halaman manual untuk tanggal
date --date='-1 day'
Maaf tidak menyebutkan saya pada sistem Solaris. Karenanya, sakelar -tanggal tidak tersedia di Solaris bash.
Saya mengetahui bahwa saya bisa mendapatkan tanggal sebelumnya dengan sedikit trik di zona waktu.
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
bash $(TZ=America/New_York date +%Y-%m-%d)
Gunakan Perl sebagai gantinya mungkin?
perl -e 'print scalar localtime( time - 86400 ) . "\n";'
Atau, gunakan nawk dan (ab) gunakan / usr / bin / adb:
nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb
Datang di ini terlalu ... gila!
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb
date --date='-1 day'
#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day
1 July , 2013
, hasil yang dicetak adalah 2013-6-1347
, sedangkan hasil yang diharapkan adalah2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
"
Anda dapat melakukan perhitungan sederhana, pimped dengan sebuah regex, jika format tanggal yang dipilih adalah 'YYYYMM':
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'
Pada bulan Januari tahun 2020 ia akan mengembalikan 201912 ;-) Tapi, itu hanya solusi, ketika tanggal tidak memiliki opsi perhitungan dan opsi penafsir tanggal lainnya (misalnya menggunakan perl) tidak tersedia ;-)
date -d "yesterday" '+%Y-%m-%d'
atau
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
pada Solaris. Jawaban Anda yang bergantung pada ekstensi GNU non-portabel ke utilitas standar POSIXdate
untuk pertanyaan tentang platform Solaris non-GNU.
Coba kode di bawah ini, yang juga menangani bagian DST.
if [ $(date +%w) -eq $(date -u +%w) ]; then
tz=$(( 10#$gmthour - 10#$localhour ))
else
tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`
Courtsey Ansgar Wiechers
Solusi sadar DST:
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.
echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
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:
echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9