शेल स्क्रिप्ट में पिछले महीने के अंतिम दिन की तारीख प्राप्त करें


11

प्रोसेसिंग दिनांक के आधार पर मुझे पिछले महीने की अंतिम तिथि कैसे मिलेगी?

उदाहरण:

  • प्रसंस्करण दिनांक = 15jan2015
  • अपेक्षित तिथि = 31d2012014,

  • प्रसंस्करण दिनांक = 10feb2015
  • अपेक्षित तिथि = 31jan2015

जवाबों:


27

GNU के साथ date:

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

कुछ खोलों में तारीख में हेरफेर के लिए अंतर्निहित समर्थन है:

के साथ ksh93:

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

के साथ zsh:

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015

4

ऐसा करने के कई तरीके हैं; यहाँ मैं पाया गया सबसे सरल है (यहाँ GNU मानकर date):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015

1
@stephane का जवाब स्पष्ट है, और यह कुछ अजीब वर्षों में काम नहीं करेगा, जहां उन दिनों को छोड़ दिया गया है जहां महीने के मध्य में जोड़ा / जोड़ा गया है। जी हां ऐसा हुआ है। देखें youtube.com/watch?v=-5wpm-gesOY
ctrl-alt-delor-

@richard, जिस तरह से GNU डेट डे ऑफसेट काम करता है (एक 1 दिन की ऑफसेट 24 घंटे एक के समान नहीं होती है), मुझे लगता है कि यह उत्तर और मेरा समकक्ष होना चाहिए और केवल समयसीमा में विफल होना चाहिए जो एक महीने के अंतिम दिन को छोड़ देगा ( आमतौर पर, अगर ऐसा कभी हुआ है जो शायद -12 के स्विच के लिए कुछ प्रशांत द्वीप में होगा: 00 ऑफसेट 12:00 ऑफसेट (या -13 से 11 ...) ...
स्टीफन चेज़लस

@ अन्य समस्याओं को इंगित करने के लिए स्टीफन धन्यवाद, समय मुश्किल है। अपने समाधान में ध्यान दें, इस मामले में कि महीने का मध्य हटा दिया गया है (यह हुआ है) तब दिन 30 नहीं 30 दिन है, इसलिए 30 घटाना आपको पिछले महीने के अंतिम दिन तक नहीं मिलेगा। मैं नहीं देख सकता कि यह एक अभ्यस्त काम क्यों है, अगर महीने का 1 दिन है (गारंटी नहीं है)। हालांकि इसका मतलब यह नहीं है कि यह होगा।
ctrl-alt-delor

@ श्रीखंड, देखें TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'। आपको एक त्रुटि मिलती है क्योंकि 2011-12-30 वहाँ नहीं था। यही है, दिन ऑफसेट कैलेंडर समय पर किया गया था। 2011-12-31 शून्य से 31 दिन आपको 2011-11-30 देता है क्योंकि यह 31 से 31 लेता है। वर्तमान समय में यह 31 * 24 * 60 * 60 * 60 सेकंड नहीं लेता है। इसकी तुलना करें TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'जो आपको २ ९वाँ देता है, यानी इस बार, यह तारीख २४ * ६० * ६० * ६० सेकंड पहले थी।
स्टीफन चेज़लस

2

यहाँ एक संस्करण है जो मैक ओएस पर काम करता है, जो बीएसडी dateउपयोगिता का उपयोग करता है :

date -v1d -v-1d +%d%b%Y

तर्क क्रम में लगाए जाते हैं। आप एक तरह की कल्पना कर सकते हैं कि एक तारीख को एक तर्क से दूसरे तक पहुंचाया जाता है। उदाहरण के लिए:

  • वर्तमान तिथि ( date) -> 2017-03-06 से प्रारंभ करें
  • उस तिथि को उसके महीने के पहले दिन ( -v1d) -> 2017-03-01 पर सेट करें
  • उससे एक दिन घटाएं ( -v-1d)-> 2017-02-28)
  • दिनांक ( +%d%b%Y) -> २eb एफ २०१ - को प्रारूपित करें

आप महीने आगे या पीछे का उपयोग कर के किसी भी संख्या तक पहुँच सकते हैं date -v-1m -v1d -v-1d, की जगह -1mमहीने पीछे या आगे की संख्या (साथ +1m) आप चाहते हैं।

यही जेनेरिक जवाब है। यह प्रश्न विशेष रूप से प्रारंभिक तिथि के सापेक्ष तिथियों के बारे में पूछता है। मैक ओएस / बीएसडी तिथि उपयोगिता आपको शुरुआत से डेटस्टैम्प की आपूर्ति नहीं करने देती है, लेकिन आप प्रत्येक तिथि तत्व को व्यक्तिगत रूप से सेट कर सकते हैं:

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31Dec2014


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.