2012-10-31 11 views
30

मैं पिछले, वर्तमान और अगले महीने प्राप्त करने के लिए नीचे दिए गए का उपयोग कर रहा Ubuntu के तहत 11.04:date` आदेश का उपयोग करते हुए `, पिछले वर्तमान और अगले महीने प्राप्त करने के लिए

LAST_MONTH=`date +'%m' -d 'last month'` 
NEXT_MONTH=`date +'%m' -d 'next month'` 
THIS_MONTH=`date +'%m' -d 'now'` 

यह अच्छी तरह से आज तक काम करता है, के अंतिम दिन अक्टूबर, 2012 (2012-10-31)

मैं अब के रूप में परिणाम के नीचे मिल:

$ date 
Wed Oct 31 15:35:26 PDT 2012 
$ date +'%m' -d 'last month' 
10 
$ date +'%m' -d 'now' 
10 
$ $ date +'%m' -d 'next month' 
12 

मुझे लगता है आउटपुट 9, 10, 0,123,106 होना चाहिए क्रमशः।

समझ में नहीं आता क्यों date आउटपुट इस तरह व्यवहार करते हैं। इसके बजाय लगातार previous, current और next महीने प्राप्त करने का एक अच्छा तरीका क्या होना चाहिए?

+0

क्या आप अभी 'महीने' के लिए महीने नहीं प्राप्त कर सकते हैं और फिर 1 जोड़ या घटा सकते हैं? –

+0

धन्यवाद। मैं यह काम समझता हूं बशर्ते आप 'Dec + 1 = Jan' आदि का ख्याल रखें। मेरा सवाल यह है कि उपर्युक्त काम क्यों नहीं करता है। – greeness

+0

आप "पिछले महीने" और "अगले महीने" के लिए गणना की गई पूर्ण तिथि प्रिंट करके अधिक अंतर्दृष्टि प्राप्त कर सकते हैं। मेरे पास अभी एक यूनिक्स टर्मिनल नहीं है, लेकिन मेरा अनुमान है कि यह अभी '30' से/30 दिनों तक/घटाता है। –

उत्तर

70

समस्या यह है कि date आपका अनुरोध काफी सचमुच लेता है और 31 सितंबर की तारीख (31 अक्टूबर से एक महीने तक) का उपयोग करने की कोशिश करता है और फिर क्योंकि यह अस्तित्व में नहीं है, यह अगले दिन तक चलता है।

इकाइयों में फ़ज़्ज़ रिश्तेदार आइटम के साथ समस्या पैदा कर सकता है: (info date से) date प्रलेखन निम्नलिखित सलाह है। उदाहरण के लिए, 2003-07-0131 -1 महीने का मूल्यांकन 2003-07-01 का मूल्यांकन हो सकता है, क्योंकि 2003-06-31 एक अमान्य तिथि है। पिछले महीने अधिक विश्वसनीय रूप से निर्धारित करने के लिए, आप वर्तमान महीने के 15 वें महीने से पहले महीने के लिए पूछ सकते हैं। उदाहरण के लिए:

$ date -R 
Thu, 31 Jul 2003 13:02:39 -0700 
$ date --date='-1 month' +'Last month was %B?' 
Last month was July? 
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' 
Last month was June! 
+0

धन्यवाद! बहुत उपयोगी! – greeness

+1

यह अगले दिन नहीं जाता है, यह पिछले महीने में दिनों की संख्या लेता है और मैंने जो देखा है उसके आधार पर इसे DoY से घटा देता है। दिनांक - दिनांक = "03/31/2015 -1 महीने" + 'तिथि:% एम-% डी-% वाई' रिटर्न "दिनांक: 03-03-2015"। 3/31/2016 रिटर्न 3/2/2016। मैं खुद -1 महीने की बात से थोड़ा सा था! हालांकि मुझे समाधान पसंद है। – Iamiuru

+0

नोट: मैं इस दृष्टिकोण का उपयोग करना चाहता था, लेकिन मैं Busybox तिथि से फंस गया था, जो थोड़ा कम पूरी तरह से फीचर्ड है और इसमें अंकगणित समय नहीं है। यह थोड़ा हास्यास्पद संशोधन इसके बजाय काम करता है: 'date -d $ (दिनांक +% वाई) - $ (($ (दिनांक +% मीटर) - 1)) - 15 +% बी'। और हाँ, यह वर्षों से काम करता है: शून्य (दिसंबर) और ऋणात्मक (पीछे की ओर गिनती) महीनों को स्वीकार करने में काफी खुशी है। – Aesin

0

मुख्य समस्या हो आप तारीख --date विकल्प उपलब्ध नहीं है जब और आप इसे स्थापित करने के लिए अनुमति नहीं है, तो नीचे की कोशिश -

Previous month 
#cal -3|awk 'NR==1{print toupper(substr($1,1,3))"-"$2}' 
DEC-2016 
Current month 
#cal -3|awk 'NR==1{print toupper(substr($3,1,3))"-"$4}' 
JAN-2017 
Next month 
#cal -3|awk 'NR==1{print toupper(substr($5,1,3))"-"$6}' 
FEB-2017 
4

यदि आप एक MacOS वातावरण में दिनांक का उपयोग कर रहे हैं तो, इस प्रयास करें:

ST1:~ ejf$ date 
Mon Feb 20 21:55:48 CST 2017 
ST1:~ ejf$ date -v-1m +%m 
01 
ST1:~ ejf$ date -v+1m +%m 
03 

इसके अलावा, मैं नहीं बल्कि हर महीने की पहली तारीख को पिछले और अगले महीने की गणना करना चाहते हैं, वें जिस तरह से आपको 30/31 या 28/29 (फरवरी/फरवरी लीप वर्ष) समाप्त होने वाले महीनों के साथ कोई समस्या नहीं होगी

संबंधित मुद्दे