รับวันที่ (วันก่อนเวลาปัจจุบัน) เป็น Bash


171

ฉันจะพิมพ์วันที่ซึ่งเป็นวันก่อนเวลาปัจจุบันใน Bash ได้อย่างไร


วันพยายาม แต่ดูเหมือนว่าจะไม่มีสวิทช์ -d ใน Solaris 10 ทุบตี
conandor

ฉันพบโซลูชันที่ยอดเยี่ยมอีกวิธีหนึ่งโดยติดตั้งวันที่ gnu (แพ็คเกจ coreutil) จาก sunfreeware
conandor

และไม่มีสวิตช์ -d ในวันที่ของ AIX
frankster

--dateหรือ-dตัวเลือกที่จะใช้ได้เฉพาะในวัน GNU
คริสจอห์นสันเอฟเอ

ดูstackoverflow.com/q/15374752/462865สำหรับรุ่น DST ที่ปลอดภัยของคำถามนี้
อาเมียร์อาลีอั

คำตอบ:


262

ถ้าคุณมีวัน GNU และฉันเข้าใจคุณอย่างถูกต้อง

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

หรือ

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

1
ผมพบว่าส่วนใหญ่จะเป็นคำตอบของปัญหา แต่สวิทช์ -d ไม่พบในวัน Solaris ของ
conandor

3
สำหรับการใช้งานบน Ubuntu ด้วยฟังก์ชั่นวันที่: $ (วันที่ +% Y:% m:% d -d "1 วันก่อน") ผลลัพธ์คือ: 2013: 04: 21 และถ้าคุณต้องการวันที่ 10 วันก่อนคุณสามารถใช้ $ (วันที่ +% Y:% m:% d -d "10 วันก่อน") หรือ $ (วันที่ +% Y:% m:% d -d "10 วันที่ผ่านมา ")
zhihong

บน OS X คุณสามารถติดตั้ง coreutils ผ่านทาง brew: ดูstackoverflow.com/questions/15374752/…
kasterma

11
date -v-1dบน OSX (ลบ), -v+1d(บวก)
bgs

2
ฟังก์ชั่นทุบตีนี้จะทำงานได้ทั้งบน Linux และ OSX โดยทั่วไปแล้วจะลองใช้สไตล์ GNU Linux ก่อน หากล้มเหลวก็ลองใช้สไตล์ OSX เรียกมันว่าอาร์กิวเมนต์จำนวนวันในอดีตที่คุณต้องการให้เป็นวันที่ หากคุณไม่ผ่านการโต้แย้งจะถือว่า 0 วัน รหัสนี้เป็นซับเดียวดังนั้นการตัดและวางควรใช้งานได้ - ไม่มีการสันนิษฐานว่าเป็นจุดสิ้นสุดของบรรทัด 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 (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

41
date --date='-1 day'

4
ข้อผิดพลาดใน macOS Sierra:date: illegal option -- -
kuanb

2
คุณต้องติดตั้งเวอร์ชัน GNU dateซึ่งมีอยู่ในcoreutilsแพ็คเกจเพื่อให้ไวยากรณ์นี้ทำงานบน macOS ได้ หากคุณใช้ Homebrew คุณสามารถติดตั้งผ่านทางbrew install coreutilsหลังจากนั้นคุณจะสามารถใช้วันที่ของ GNU ผ่านgdateคำสั่ง ดู: topbug.net/blog/2013/04/14/…
sumitsu

17

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


7

นี่เป็นคำตอบที่ล่าช้า แต่ดูเหมือนว่าจะใช้ได้ !!

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


4

ขออภัยที่ไม่ได้กล่าวถึงฉันในระบบ Solaris ดังนั้นสวิตช์ -date จึงไม่พร้อมใช้งานบน Solaris bash

ฉันพบว่าฉันสามารถรับวันที่แล้วโดยใช้กลอุบายเล็กน้อยในเขตเวลา

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

วิธีนี้ไม่น่าเชื่อถือ 100% (จริง ๆ แล้วประมาณ 98%) หากคุณอาศัยอยู่ในสถานที่โดยใช้การปรับเวลาตามฤดูกาล
jlliagre

ไม่อย่างแน่นอนคุณสามารถใช้ bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002



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

ทำให้วันของเมื่อวานนี้ในรูปแบบ YYYY-MM-DD $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 สำหรับการแก้ไขวิธีการที่น่าสนใจแม้ว่ามันจะค่อนข้างละเอียด
Peter Lindqvist

1
สวัสดี medoix ฉันไม่สามารถค้นหาความหมายของ $ {$ #} ฉันรู้ว่า $ # ย่อมาจากจำนวนการขัดแย้งกับสคริปต์ / ฟังก์ชั่น แต่ฉันไม่สามารถเกี่ยวข้องกับเรื่องนี้ กรุณาช่วย.
Karthick S

วิธีนี้ใช้ไม่ได้ในวันก่อนหน้าเมื่อมีการเปลี่ยนแปลงเดือน ตัวอย่างเช่นวันนี้คือ1 July , 2013ผลลัพธ์ที่พิมพ์ออกมา2013-6-1347ในขณะที่ผลลัพธ์ที่คาดไว้คือ2013-6-30
เข้าใจผิด

แทน 3 บรรทัดระหว่าง "fi" ลอง "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov

1

คุณสามารถทำการคำนวณแบบง่าย ๆ ได้โดยใช้ regex หากรูปแบบวันที่ที่เลือกคือ 'YYYYMM':

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

ในเดือนมกราคมปี 2020 จะส่งคืน 201912 ;-) แต่เป็นเพียงวิธีแก้ปัญหาเมื่อวันที่ไม่มีตัวเลือกการคำนวณและตัวเลือกตัวแปลวันที่อื่น ๆ (เช่นการใช้ Perl) ไม่สามารถใช้ได้ ;-)


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

หรือ

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

ผลลัพธ์นั้นdate: illegal option: -dบนโซลาริส คำตอบของคุณนั้นขึ้นอยู่กับส่วนขยาย GNU ที่ไม่สามารถพกพาได้ไปยังยูทิลิตี้มาตรฐาน POSIXdateสำหรับคำถามเกี่ยวกับแพลตฟอร์มที่ไม่ใช่ GNU Solaris
Andrew Henle


0

วิธีแก้ไขปัญหา 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

0

ไม่เซ็กซี่มาก แต่อาจทำงาน:

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

สร้างจากคำตอบ "มาร์ตินเคลย์ตัน"


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.