เพียงใช้date
และเชื่อถือวินาที:
ในขณะที่คุณชี้ให้เห็นอย่างถูกต้องรายละเอียดจำนวนมากเกี่ยวกับการคำนวณพื้นฐานจะถูกซ่อนหากคุณใช้การคำนวณเวลาภาษาอังกฤษ เช่น-d yesterday
และ-d 1 day ago
จะมีพฤติกรรมที่แตกต่าง
แต่คุณสามารถเชื่อถือได้ขึ้นอยู่กับวินาที (บันทึกไว้อย่างแม่นยำ) ตั้งแต่ unix epoch UTC และ bash arithmetic เพื่อรับช่วงเวลาที่คุณต้องการ:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
นี้ก็ชี้ให้เห็นในอีกคำตอบ แบบฟอร์มนี้สามารถพกพาข้ามแพลตฟอร์มที่มีการdate
ตั้งค่าสถานะบรรทัดคำสั่งต่างกันเป็นภาษาที่ไม่ขึ้นกับภาษา (เช่น "เมื่อวาน" เทียบกับ "hier" ในภาษาฝรั่งเศส) และตรงไปตรงมา (ในระยะยาว) จะง่ายต่อการจดจำ รู้แล้ว คุณอาจถามตัวเองต่อไปว่า: "เป็นอย่างนั้น-d 2 hours ago
หรือ-d 2 hour ago
อีกครั้ง?" หรือ "มันเป็น-d yesterday
หรือ-d 1 day ago
ที่ฉันต้องการ?") @
บิตหากินเฉพาะที่นี่เป็น
อาวุธทุบตีและไม่มีอะไรอื่น:
ทุบตีบนทุบตีเท่านั้นคุณยังสามารถรับเวลาของเมื่อวานผ่าน printf builtin:
%(datefmt)T
causes printf to output the date-time string resulting from using
datefmt as a format string for strftime(3). The corresponding argu‐
ment is an integer representing the number of seconds since the
epoch. Two special argument values may be used: -1 represents the
current time, and -2 represents the time the shell was invoked.
If no argument is specified, conversion behaves as if -1 had
been given.
This is an exception to the usual printf behavior.
ดังนั้น,
# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))
หรือเทียบเท่ากับตัวแปร temp (ตัวเลือก subshell ด้านนอก แต่ทำให้สภาพแวดล้อมของ vars สะอาด)
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
หมายเหตุ: แม้จะมี manpage ที่ระบุว่าไม่มีการโต้แย้งกับตัว%()T
จัดรูปแบบจะถือว่าเป็นค่าเริ่มต้น-1
แต่ฉันดูเหมือนจะได้รับ 0 แทน (ขอบคุณ bash manual version 4.3.48)