बस उपयोग date
और भरोसेमंद सेकंड:
जैसा कि आप ठीक से इंगित करते हैं, अंतर्निहित गणना के बारे में बहुत सारे विवरण छिपे हुए हैं यदि आप अंग्रेजी समय अंकगणित पर भरोसा करते हैं। जैसे -d yesterday
, और -d 1 day ago
अलग व्यवहार होगा।
इसके बजाय, आप मज़बूती से यूनिक्स युग यूटीसी के बाद (ठीक दस्तावेज) सेकंड पर निर्भर कर सकते हैं, और उस क्षण को प्राप्त करने के लिए अंकगणित को मार सकते हैं जो आप चाहते हैं:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
यह एक और जवाब में बताया गया था । यह फ़ॉर्म विभिन्न date
कमांड लाइन के झंडे वाले प्लेटफार्मों में अधिक पोर्टेबल है , भाषा-स्वतंत्र है (उदाहरण के लिए "फ्रेंच लोकेल में" बनाम "" "पदानुक्रम"), और स्पष्ट रूप से (लंबी अवधि में) याद रखना आसान होगा, क्योंकि अच्छी तरह से, आप यह पहले से ही पता है। आप अन्यथा खुद पूछ रख सकते हैं: "यह था -d 2 hours ago
या -d 2 hour ago
फिर?" या "क्या यह -d yesterday
या -d 1 day ago
जो मुझे चाहिए?")। यहाँ केवल मुश्किल सा है @
।
बैश के साथ सशस्त्र और कुछ नहीं:
बैश पर पूरी तरह से बैश, आप प्रिंटफ बिलिन के माध्यम से कल का समय भी प्राप्त कर सकते हैं:
%(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 ))
या, समान रूप से एक अस्थायी चर (बाहरी सब-वैकल्पिक वैकल्पिक, लेकिन पर्यावरण चर को साफ रखता है)।
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
नोट: मैनपेज के यह कहने के बावजूद कि %()T
फॉर्मेट करने वाले के लिए कोई भी तर्क डिफ़ॉल्ट नहीं होगा -1
, मुझे लगता है कि इसके बजाय 0 मिलेगा (धन्यवाद, bash मैनुअल संस्करण 4.3.48)