2009-07-31 12 views
11

यह कोड में कोई बदलाव नहीं होने के साथ कल ठीक काम कर रहा था।PHP स्ट्रेटोटाइम -1month -2month

echo date("M", strtotime("-3 month", time())); 
echo date("M", strtotime("-2 month", time())); 
echo date("M", strtotime("-1 month", time())); 
echo date("M", time()); 

उत्पादन यह कल का निर्माण किया गया था के रूप में आप expect- हैं अर्थात अप्रैल, मई, जून, जुलाई

आज यह गूँज मई मई Jul Jul

कोई भी विचार किया गया था?

अग्रिम धन्यवाद।

+3

आज, हम 31 वें हैं; उस से संबंधित कुछ हो सकता है ^^ –

उत्तर

11

यह बग से संबंधित हो सकती #44073

आप कुछ इस तरह के साथ की कोशिश कर सकते:

echo date("M", strtotime("-3 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", strtotime("-2 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", strtotime("-1 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", time()) . "\n"; 

(strtotime की टिप्पणी अनुभाग में पाया समाधान; direct link)

और आउटपुट:

Apr 
May 
Jun 
Jul 

दिनांक स्वरूप और महीने का नाम और वह सब के साथ "धोखा दे" की तरह ...

4

strtotime के बजाय इस प्रयास करें:

mktime(0, (date("n") - 3 + 12) % 12, 1) 

विचार चालू माह के नंबर लेने के लिए है (date("n")), इसे इच्छित महीनों की संख्या घटाएं (यहां -3), इसमें 12 जोड़ें और फिर मॉड्यूल 12 प्राप्त करें।

+0

अच्छा समाधान, बहुत साफ –

3

यह ज्ञात और अपेक्षित व्यवहार है। इसका कारण यह है कि महीने कोई निश्चित लंबाई वाला सापेक्ष दिनांक है। http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120

समय विस्थापन की इकाई पूरे वर्ष या महीनों तक चलने के लिए स्ट्रिंग 'वर्ष' या 'माह' द्वारा चुनी जा सकती है। ये अस्पष्ट इकाइयां हैं, क्योंकि वर्षों और महीनों में समान अवधि नहीं है। अधिक सटीक इकाइयां 'पखवाड़े' हैं जो 14 दिनों के लायक हैं, 7 सप्ताह के 'सप्ताह', 24 घंटे के 'दिन', 60 मिनट के 'घंटे', 'मिनट' या 'मिनट' 60 सेकंड के लायक हैं, और 'दूसरा' या एक सेकंड के लायक 'सेक'। इन इकाइयों पर एक 'प्रत्यय' स्वीकार किया जाता है और अनदेखा किया जाता है।

नतीजतन (जोर मेरा)

इकाइयों में फ़ज़्ज़ रिश्तेदार आइटम के साथ समस्या पैदा कर सकते। उदाहरण के लिए, 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! 

ऊपर के रूप में

echo date('M', strtotime(date('Y-m-') . '15 -1 month')); 

इसके अलावा PHP में व्यक्त किया जा सकता नीचे http://bugs.php.net/bug.php?id=22486

0

commments देखना एक आसान तरीका यह इस

की तरह लिखने के लिए हो सकता है

गूंज दिनांक ("एम", स्ट्रेटोटाइम ("इस वर्ष +3 महीने"));

या

गूंज तिथि ("एम", strtotime ("इस महीने -3 महीने"));

निर्भर करता है आपके क्या यह ..

7

Gorden सही ढंग से समस्या का पता चला के लिए उपयोग कर, लेकिन मैं एक और समाधान, जो उपयोगी और के रूप में तकनीकी नहीं था देना चाहता था। बस अपने strtotime में "पहले दिन" या "अंतिम दिन" का उपयोग करें।

// Today is May 31st 
//All the following return 2012-04-30 
echo date('Y-m-d', strtotime("last day of -1 month")); 
echo date('Y-m-d', strtotime("last day of last month")); 
echo date_create("last day of -1 month")->format('Y-m-d'); 

// All the following return 2012-04-01 
echo date('Y-m-d', strtotime("first day of -1 month")); 
echo date('Y-m-d', strtotime("first day of last month")); 
echo date_create("first day of -1 month")->format('Y-m-d'); 
2

पीएचपी 5.3 (रेफरी: https://bugs.php.net/bug.php?id=44073) से: और उच्च आप कर सकते हैं:

"first day of +1 month" या "first day of next month" या "पूर्व, इन निम्न उदाहरण एक महीने की 31 पर इस मुद्दे पर काबू पाने last day of next month "

उदाहरण:

$date = '2015-12-31'; 

echo date("Y-m-d", strtotime($date ."first day of previous month")); 

होगा उत्पादन: 2015-11-01 यह गणना नहीं करता है +30 दिनों के समय के आधार पर दिन।

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