Tarih (şimdiki saatten bir gün önce) hakkında Bash


171

Bash'de şu anki saatten bir gün önce olan tarihi nasıl yazdırabilirim?


Denenmiş bir tarih ama Solaris 10'un
bashinde

Sunfreeware gnu tarih (coreutil paketi) yükleyerek başka bir harika çözüm buldum.
conandor

ne
AIX'in

--dateVeya -dopsiyon GNU tarihi kullanılabilir
Chris FA Johnson

Bu sorunun DST için güvenli bir sürümü için stackoverflow.com/q/15374752/462865 adresine bakın .
Amir Ali Akbari

Yanıtlar:


262

GNU tarihiniz varsa ve sizi doğru anladıysam

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

veya

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09

1
En çok önerilen cevap olarak buldum ama -d anahtarı Solaris'in tarihinde bulunamadı
conandor

3
Tarih işlevli Ubuntu'da kullanım için: $ (tarih +% Y:% m:% d -d "1 gün önce") çıktı: 2013: 04: 21. Ve 10 gün önceki tarihi istiyorsanız, $ (tarih +% Y:% m:% d -d "10 gün önce") veya $ (tarih +% Y:% m:% d -d "10 kullanabilirsiniz gün önce ")
zhihong

OS X'te coreutils'i demleme yoluyla kurabilirsiniz: bkz. Stackoverflow.com/questions/15374752/…
kasterma

11
date -v-1dOSX (eksi), -v+1d(artı)
bgs

2
Bu bash işlevi hem Linux hem de OSX üzerinde çalışacaktır. Temel olarak önce GNU Linux stilini dener. Bu başarısız olursa OSX stilini dener. Bunu, geçmişte tarih istediğiniz gün sayısının bağımsız değişkeniyle arayın. Hiçbir argüman iletmezseniz 0 gün varsayılır. Bu kod bir astardır, bu nedenle kes ve yapıştır çalışmalıdır - satır sonu varsayılmaz. 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

BSD'niz (OSX) datevarsa bunu yapabilirsiniz:

date -j -v-1d
Wed Dec 14 15:34:14 CET 2011

Veya tarih hesaplamalarını keyfi bir tarihte yapmak istiyorsanız:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31

41
date --date='-1 day'

4
MacOS Sierra'da date: illegal option -- -
Erros

2
Bu sözdiziminin macOS üzerinde çalışmasını sağlamak için date, coreutilspaket aracılığıyla kullanılabilen GNU sürümünü yüklemeniz gerekir . Homebrew kullanıyorsanız, kurabilirsiniz brew install coreutils, daha sonra gdatekomut aracılığıyla GNU tarihini kullanabilmeniz gerekir . Bkz: topbug.net/blog/2013/04/14/…
sumitsu


7

Peki bu geç bir cevap, ama bu işe yarıyor gibi görünüyor !!

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


4

Solaris sisteminde benden bahsetmediğim için üzgünüm. Bu nedenle, -date anahtarı Solaris bash'de mevcut değildir.

Önceki tarihi saat diliminde küçük bir numarayla alabileceğimi öğrendim.

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE

Yaz saati uygulaması kullanan bir yerde yaşıyorsanız bu yöntem% 100 güvenilir değildir (yaklaşık% 98).
jlliagre

Tam olarak değil, kullanabilirsiniz bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

Bunun yerine Perl kullanın?

perl -e 'print scalar localtime( time - 86400 ) . "\n";'

Veya nawk kullanın ve (ab) / usr / bin / adb kullanın:

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

Bu da karşı karşıya geldi ... deli!

/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`

Dünün tarihini YYYY-AA-GG biçiminde değişkene yerleştirir $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 düzeltme, ilginç yöntem, biraz ayrıntılı olmasına rağmen.
Peter Lindqvist

1
Merhaba medoix, $ {$ #} anlamını bulamıyorum. $ # Bir komut dosyası / işlev için bağımsız değişken sayısı anlamına gelir. Ama bununla ilişki kuramıyorum. Lütfen yardım et.
Karthick S

Bu ayın değişmesinden önceki gün için geçerli değildir. Örneğin, günümüzde 1 July , 2013, sonuç olan yazdırılmasına 2013-6-1347beklenen sonuç ise,2013-6-30
yanlış

"Fi" deneyin "günü = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1" arasındaki 3 satır yerine
Anton Roslov

1

Seçilen tarih biçimi 'YYYYMM' ise, normal ifadeyle pim haline getirilmiş basit bir hesaplama yapabilirsiniz:

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

Ocak 2020'de 201912 ;-) döndürecektir. Ancak, tarihte hesaplama seçenekleri ve diğer tarih yorumlayıcı seçenekleri (ör. Perl kullanarak) mevcut değil ;-) sadece bir çözümdür



0

DST parçasına da dikkat eden aşağıdaki kodu deneyin.

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

DST farkında çözüm:

Saat dilimini değiştirmek, saati birkaç saat değiştirmek için mümkündür. Yaz saati uygulaması nedeniyle 24 saat önce bugün veya dünden önceki gün olabilir.

Dünün 20 veya 30 saat önce olduğundan eminsiniz. Hangisi? En sonuncusu bugün değil.

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

Echo komutunda kullanılan -e parametresi bash ile gereklidir, ancak ksh ile çalışmaz. Ksh içinde -e bayrağı olmadan aynı komutu kullanabilirsiniz.

Komut dosyanız farklı ortamlarda kullanıldığında, komut dosyasını #! / Bin / ksh veya #! / Bin / bash ile başlatabilirsiniz. \ N yerine bir satırsonu yazabilirsiniz:

echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

0

Çok seksi değil ama işi yapabilir:

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

"Martin clayton" cevabından oluşturulmuştur.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.