Dapatkan tanggal (sehari sebelum waktu sekarang) di Bash


171

Bagaimana saya bisa mencetak tanggal yang merupakan hari sebelum waktu saat ini di Bash?


Mencoba tanggal tetapi tampaknya seperti tidak ada saklar -d di Solaris 10 ini pesta
conandor

Saya menemukan solusi hebat lainnya dengan menginstal gnu date (paket coreutil) dari sunfreeware.
Conandor

juga tidak ada saklar -d pada tanggal AIX
frankster

The --dateatau -dpilihan hanya tersedia di tanggal GNU
Chris FA Johnson

Lihat stackoverflow.com/q/15374752/462865 untuk versi DST-aman dari pertanyaan ini.
Amir Ali Akbari

Jawaban:


262

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

1
Saya menemukan sebagian besar adalah sebagai jawaban disarankan tapi beralih -d tidak ditemukan dalam Solaris tanggal
conandor

3
Untuk penggunaan di Ubuntu dengan fungsi tanggal: $ (tanggal +% Y:% m:% d -d "1 hari yang lalu"), outputnya adalah: 2013: 04: 21. Dan jika Anda menginginkan tanggal 10 hari sebelumnya, Anda dapat menggunakan $ (tanggal +% Y:% m:% d -d "10 hari yang lalu") atau $ (tanggal +% Y:% m:% d -d "10 hari yang lalu ")
zhihong

Pada OS X Anda dapat menginstal coreutils melalui brew: lihat stackoverflow.com/questions/15374752/…
kasterma

11
date -v-1dpada OSX (minus), -v+1d(plus)
bgs

2
Fungsi bash ini akan berfungsi pada Linux dan OSX. Pada dasarnya ia mencoba gaya GNU Linux terlebih dahulu. Jika gagal, ia mencoba gaya OSX. Sebut saja dengan argumen jumlah hari di masa lalu yang Anda inginkan tanggalnya. Jika Anda tidak memberikan argumen, anggapannya 0 hari. Kode ini adalah satu-liner, jadi potong dan tempel harus berfungsi - tidak ada garis akhir yang diasumsikan. 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 }
Noah Spurrier

50

Jika Anda memiliki BSD (OSX) dateAnda 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

41
date --date='-1 day'

4
Erros di macOS Sierra:date: illegal option -- -
kuanb

2
Anda perlu menginstal versi GNU date, tersedia melalui coreutilspaket, 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 gdateperintah. Lihat: topbug.net/blog/2013/04/14/…
sumitsu


7

Yah ini jawaban yang terlambat, tapi ini sepertinya berhasil !!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;


4

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

Metode ini tidak 100% andal (sekitar 98% sebenarnya) jika Anda tinggal di tempat yang menggunakan waktu musim panas.
jlliagre

Tidak juga, Anda dapat menggunakan bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

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


1
yesterday=`date -d "-1 day" %F`

Menempatkan tanggal kemarin dalam format YYYY-MM-DD ke dalam variabel $yesterday.


1
#!/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 untuk koreksi, metode yang menarik, meskipun sedikit verbose.
Peter Lindqvist

1
Hai medoix, saya tidak dapat menemukan arti $ {$ #}. Saya tahu bahwa $ # berarti jumlah argumen untuk skrip / fungsi. Tetapi saya tidak dapat menghubungkannya dengan ini. Tolong bantu.
Karthick S

Ini tidak berfungsi untuk hari previus pada perubahan bulan. Misalnya hari ini 1 July , 2013, hasil yang dicetak adalah 2013-6-1347, sedangkan hasil yang diharapkan adalah2013-6-30
sesat

Alih-alih 3 baris antara "fi" coba "hari = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov

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 ;-)


1
date -d "yesterday" '+%Y-%m-%d'

atau

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date

Itu menghasilkan date: illegal option: -dpada Solaris. Jawaban Anda yang bergantung pada ekstensi GNU non-portabel ke utilitas standar POSIXdate untuk pertanyaan tentang platform Solaris non-GNU.
Andrew Henle

0

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


0

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

0

Tidak terlalu seksi tetapi mungkin melakukan pekerjaan:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

Diformulasikan dari jawaban "martin clayton".


-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9

Bagaimana kalau hari ini tanggal 1 Januari?
martin clayton
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.