ฉันจะพิมพ์วันที่ซึ่งเป็นวันก่อนเวลาปัจจุบันใน Bash ได้อย่างไร
--date
หรือ-d
ตัวเลือกที่จะใช้ได้เฉพาะในวัน GNU
ฉันจะพิมพ์วันที่ซึ่งเป็นวันก่อนเวลาปัจจุบันใน Bash ได้อย่างไร
--date
หรือ-d
ตัวเลือกที่จะใช้ได้เฉพาะในวัน GNU
คำตอบ:
ถ้าคุณมีวัน GNU และฉันเข้าใจคุณอย่างถูกต้อง
$ date +%Y:%m:%d -d "yesterday"
2009:11:09
หรือ
$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
date -v-1d
บน OSX (ลบ), -v+1d
(บวก)
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 }
หากคุณมี BSD (OSX) date
คุณสามารถทำสิ่งนี้ได้:
date -j -v-1d
Wed Dec 14 15:34:14 CET 2011
หรือถ้าคุณต้องการคำนวณวันที่ในวันที่ใดก็ได้:
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
ซึ่งมีอยู่ในcoreutils
แพ็คเกจเพื่อให้ไวยากรณ์นี้ทำงานบน macOS ได้ หากคุณใช้ Homebrew คุณสามารถติดตั้งผ่านทางbrew install coreutils
หลังจากนั้นคุณจะสามารถใช้วันที่ของ GNU ผ่านgdate
คำสั่ง ดู: topbug.net/blog/2013/04/14/…
MAC OSX
สำหรับวันที่เมื่อวาน:
date -v-1d +%F
โดยที่1dกำหนดวันปัจจุบันลบ 1 วัน ในทำนองเดียวกัน
วันที่ -v-1w +% F - สำหรับวันที่ในสัปดาห์ก่อนหน้า
date -v-1m +% F - สำหรับวันที่เดือนก่อนหน้า
หากคุณมี GNU DATE
date --date="1 day ago"
ข้อมูลเพิ่มเติม: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
นี่เป็นคำตอบที่ล่าช้า แต่ดูเหมือนว่าจะใช้ได้ !!
YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
echo $YESTERDAY;
คู่มือการใช้สคริปต์ Bash ขั้นสูง
date +%Y:%m:%d -d "yesterday"
สำหรับรายละเอียดเกี่ยวกับรูปแบบวันที่ให้ดูหน้าคนสำหรับวันที่
date --date='-1 day'
ขออภัยที่ไม่ได้กล่าวถึงฉันในระบบ Solaris ดังนั้นสวิตช์ -date จึงไม่พร้อมใช้งานบน Solaris bash
ฉันพบว่าฉันสามารถรับวันที่แล้วโดยใช้กลอุบายเล็กน้อยในเขตเวลา
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
bash $(TZ=America/New_York date +%Y-%m-%d)
ใช้ Perl แทนบางที
perl -e 'print scalar localtime( time - 86400 ) . "\n";'
หรือใช้ nawk และ (ab) ใช้ / usr / bin / adb:
nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb
มาข้ามสิ่งนี้ด้วย ... บ้า!
/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'
yesterday=`date -d "-1 day" %F`
ทำให้วันของเมื่อวานนี้ในรูปแบบ YYYY-MM-DD $yesterday
ลงในตัวแปร
#!/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
ผลลัพธ์ที่พิมพ์ออกมา2013-6-1347
ในขณะที่ผลลัพธ์ที่คาดไว้คือ2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
"
คุณสามารถทำการคำนวณแบบง่าย ๆ ได้โดยใช้ regex หากรูปแบบวันที่ที่เลือกคือ 'YYYYMM':
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'
ในเดือนมกราคมปี 2020 จะส่งคืน 201912 ;-) แต่เป็นเพียงวิธีแก้ปัญหาเมื่อวันที่ไม่มีตัวเลือกการคำนวณและตัวเลือกตัวแปลวันที่อื่น ๆ (เช่นการใช้ Perl) ไม่สามารถใช้ได้ ;-)
date -d "yesterday" '+%Y-%m-%d'
หรือ
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
บนโซลาริส คำตอบของคุณนั้นขึ้นอยู่กับส่วนขยาย GNU ที่ไม่สามารถพกพาได้ไปยังยูทิลิตี้มาตรฐาน POSIXdate
สำหรับคำถามเกี่ยวกับแพลตฟอร์มที่ไม่ใช่ GNU Solaris
ลองโค้ดด้านล่างซึ่งดูแลส่วน 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
วิธีแก้ไขปัญหา DST:
การจัดการเขตเวลาเป็นไปได้สำหรับการเปลี่ยนนาฬิกาบางชั่วโมง เนื่องจากเวลาออมแสง 24 ชั่วโมงที่ผ่านมาสามารถเป็นวันนี้หรือวันก่อนเมื่อวาน
คุณแน่ใจว่าเมื่อวานนี้คือ 20 หรือ 30 ชั่วโมงที่ผ่านมา อันไหน? ดีล่าสุดที่ไม่ใช่วันนี้
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
จำเป็นต้องใช้พารามิเตอร์ -e ที่ใช้ในคำสั่ง echo ด้วย bash แต่จะไม่ทำงานกับ ksh ใน ksh คุณสามารถใช้คำสั่งเดียวกันโดยไม่มีแฟล็ก -e
เมื่อสคริปต์ของคุณจะถูกใช้ในสภาพแวดล้อมที่แตกต่างกันคุณสามารถเริ่มต้นสคริปต์ด้วย #! / bin / ksh หรือ #! / bin / bash คุณสามารถแทนที่ \ n ด้วยบรรทัดใหม่:
echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
ไม่เซ็กซี่มาก แต่อาจทำงาน:
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)'
สร้างจากคำตอบ "มาร์ตินเคลย์ตัน"
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9