Dapatkan tanggal (sehari sebelum waktu sekarang) di Bash

171

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

Conandor
sumber
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
ghostdog74
sumber
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
Jacob Persson
sumber
41
date --date='-1 day'
diam
sumber
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
17

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

Maverick
sumber
7

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

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

Panduan Script Bash Lanjutan

date +%Y:%m:%d -d "yesterday"

Untuk detail tentang format tanggal, lihat halaman manual untuk tanggal

date --date='-1 day'
Peter Lindqvist
sumber
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
Conandor
sumber
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
martin clayton
sumber
2

date --date='-1 day'

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

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

Heinzi
sumber
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
medoix
sumber
+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 ;-)

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

atau

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
suresh Palemoni
sumber
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

sesat
sumber
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
Walter A
sumber
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".

trox
sumber
-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9
Vijay
sumber
Bagaimana kalau hari ini tanggal 1 Januari?
martin clayton