2012-10-29 15 views
5

PHP में दिनांक समय कक्षा (5.3+) तब तक बहुत बढ़िया काम करती है जब तक कि आपके देश में सप्ताह का पहला दिन रविवार न हो। नीदरलैंड में सप्ताह का पहला दिन सोमवार है और यह सप्ताह के दृश्य और गणना के साथ कैलेंडर बनाने के लिए कक्षा को बेकार बनाता है।PHP डेटटाइम() कक्षा, सप्ताह के पहले दिन सोमवार

मुझे स्टैक ओवरफ्लो या बाकी इंटरनेट पर डेटटाइम कार्य करने का तरीका नहीं लगता है जैसे कि सप्ताह का पहला दिन सोमवार है।

मुझे यह टुकड़ा स्टैक ओवरफ्लो पर मिला, लेकिन यह मुसीबत में आने वाले सभी तरीकों को ठीक नहीं करता है और यह एक सुरुचिपूर्ण समाधान नहीं है।

$dateTime = new DateTime('2012-05-14'); 
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week'); 

क्या इस समय या सीमा दिनांक बदलने के लिए कोई तरीका है? कल्पना नहीं कर सकता कि यह एक सेटिंग नहीं है क्योंकि ज्यादातर यूरोप सोमवार को अपने सप्ताह शुरू करते हैं।

जोड़ा गया: पोस्ट करना पूर्ण कैलेंडर और कार्यों कोड बातें स्पष्ट नहीं होगा। लेकिन उदाहरण के लिए यहां एक पंक्ति है। मुझे अक्सर यह देखना होगा कि सप्ताह का पहला दिन सप्ताह के पहले दिन से उस सप्ताह में एक अलग तिथि और समय पर गणना करता है या नहीं। मेरा कोड इन से भरा हो रहा है:

$startOfWeek = $date->modify(('Sunday' == $date->format('l')) ? 'Monday last week' : 'Monday this week')->modify('+3 hours')->format(DATETIME); 

मुझे महीने या वर्ष के पहले पूर्ण सप्ताह को प्राप्त करने का प्रयास करने का एक अवांछित परिणाम भी मिलता है। चूंकि मेरी $ डेट ऑब्जेक्ट में हमेशा एक ही तारीख नहीं होती है, इसलिए मुझे इसे इस तरह से जांचना पड़ता है, जिससे कोड को पढ़ने में मुश्किल होती है। इस कैलेंडर पर करने के लिए बहुत अधिक प्रोग्रामिंग होने के बाद मैं यह नहीं कह सकता कि यह फिर से बग करने जा रहा है।

संपादित वहाँ कुछ विसंगतियां हालांकि रहे हैं। कुछ अजीब कारण के लिए दिनांक समय यह अगले एक सही प्राप्त करता है:

$test = new DateTime('2012-10-29'); // Monday 
echo $test->modify('Sunday this week')->format('Y-m-d'); // 2012-11-04 

// But... 

$test = new DateTime('2012-11-04'); // Sunday 
echo $test->modify('Monday this week')->format('Y-m-d'); // 2012-11-05 instead of 2012-10-29 

लेकिन मैं मैं सवाल स्पष्ट कर सकते हैं लगता है: दिनांक समय() वर्ग सप्ताह के पहले दिन के रूप में सोमवार से इस्तेमाल किया जा सकता। यदि नहीं, तो कक्षा को सप्ताह के पहले दिन के रूप में सोमवार का उपयोग करने के लिए बढ़ाया जा सकता है।

अद्यतन: ठीक है, मुझे लगता है कि मैंने कहीं हो रही है ... मैं कोडिंग classes..but इस सप्ताह के लिए काम करने के लिए लगता है पर एक समर्थक नहीं हूँ। लेकिन यह अभी भी दिन नाम रविवार खुद के लिए पहले दिन, दूसरे दिन के लिए नियमों की जरूरत है ... और भी। मुझे नहीं लगता कि यह मूर्खतापूर्ण है। मैं इसे ठीक करने में किसी भी मदद की सराहना करता हूं।

class EuroDateTime extends DateTime { 

// Fields 
private $weekModifiers = array (
    'this week', 
    'next week', 
    'previous week', 
    'last week' 
); 

// Override "modify()" 
public function modify($string) { 

    // Search pattern 
    $pattern = '/'.implode('|', $this->weekModifiers).'/'; 

    // Change the modifier string if needed 
    if ($this->format('N') == 7) { // It's Sunday 
     $matches = array(); 
     if (preg_match($pattern, $string, $matches)) { 
      $string = str_replace($matches[0], '-7 days '.$matches[0], $string); 
     } 
    } 
    return parent::modify($string); 

} 

} 
// This works 
$test = new EuroDateTime('2012-11-04'); 
echo $test->modify('Monday this week')->format('Y-m-d'); 
// And I can still concatenate calls like the DateTime class was intended 
echo $test->modify('Monday this week')->modify('+3 days')->format('Y-m-d'); 
+2

आप वास्तव में क्या समस्या का सामना कर रहे हैं? – Jon

+2

एक एक्सवाई समस्या की तरह लगता है। तथ्य यह है कि रविवार को 0 पर मैप किया गया है, आपको किसी अन्य दिन के रूप में सप्ताह की शुरुआत निर्धारित करने के लिए एक अलग तकनीक का उपयोग करने से नहीं रोकना चाहिए। – cmbuckley

+0

आपका प्रश्न सार है। कैलेंडर बनाने के लिए उपयोग किए जाने वाले कोड को प्रदान करें। अभी तक आपके प्रश्न – BeRocket

उत्तर

5

मुझे यह काम करने के लिए मिला, फिर भी PHP की डेटटाइम कक्षा में कुछ विसंगतियां हैं।

यदि प्रस्थान की तारीख रविवार है तो पिछले सोमवार को उसी सप्ताह (इस कक्षा द्वारा तय नहीं) माना जाता है। लेकिन सोमवार से प्रस्थान, अगले रविवार को एक ही सप्ताह के रूप में माना जाता है। अगर वे भविष्य में इसे ठीक करते हैं तो इस वर्ग को कुछ जोड़ों की आवश्यकता होगी।

class EuroDateTime extends DateTime { 

// Override "modify()" 
public function modify($string) { 

    // Change the modifier string if needed 
    if ($this->format('N') == 7) { // It's Sunday and we're calculating a day using relative weeks 
     $matches = array(); 
     $pattern = '/this week|next week|previous week|last week/i'; 
     if (preg_match($pattern, $string, $matches)) { 
      $string = str_replace($matches[0], '-7 days '.$matches[0], $string); 
     } 
    } 
    return parent::modify($string); 

} 

} 
2

आप मैन्युअल रूप से एक तारीख को संशोधित "प्रथम" की अपनी परिभाषा के आधार पर सप्ताह के "प्रथम" दिन पाने के लिए, को रोकने के लिए कुछ भी नहीं है। उदाहरण के लिए:

$firstDayOfWeek = 1; // Monday 
$dateTime = new DateTime('2012-05-16'); // Wednesday 

// calculate how many days to remove to get back to the "first" day 
$difference = ($firstDayOfWeek - $dateTime->format('N')); 
if ($difference > 0) { $difference -= 7; } 
$dateTime->modify("$difference days"); 

var_dump($dateTime->format('r')); // "Mon, 14 May 2012 00:00:00 +0000" 

ध्यान दें कि $firstDayOfWeek भिन्न होने पर आउटपुट कैसे बदलता है; अगर यह ऊपर 4 (गुरुवार) में बदल गया था, यह तो Thu, 10 May 2012 "पहली" दिन के रूप में विचार किया जाएगा।

संपादित: इस एक नहीं बल्कि बुनियादी उदाहरण है। यह करने के लिए सही तरीका उपयोगकर्ता/प्रणाली किसी भी स्थान का उपयोग कर आप "पहली" दिन देने के लिए, और वहाँ से गणना करने के लिए कर रहा है। अधिक जानकारी के लिए this question देखें।

+0

धन्यवाद cbuckley, क्या इसका मतलब यह है कि डेटटाइम क्लास को सोमवार को पहले सप्ताह के रूप में उपयोग करने के लिए सेट नहीं किया जा सकता है? – Edward

+0

कुछ भी स्मार्ट के लिए, इसे करने का सही तरीका लोकेल का उपयोग करेगा। मैंने उस प्रभाव में एक अद्यतन जोड़ा है। – cmbuckley

+0

cbuckly, मुझे नहीं लगता कि लोकेल अपडेट हो गया है। मैं अब आपके उदाहरण के आधार पर एक कक्षा लिखने की कोशिश कर रहा हूं जो 'अगले सप्ताह', 'इस सप्ताह', 'पिछले सप्ताह' जैसी कुछ भी चीज़ों को रोक देगा और इसे बदल देगा। डुनो अगर मैं अपना समय बर्बाद कर रहा हूं .. – Edward

0

मैं भी समस्या क्या है के बारे में उलझन में हूँ, क्योंकि DateTimeकरता सोमवार से शुरू होने वाले सप्ताह की एक धारणा है: N format आप सप्ताह सोमवार जा रहा है 1 और रविवार के साथ, सोमवार से रविवार तक से गिनती के दिन देता है 7. इसके अलावा, W प्रारूप, सप्ताह का नंबर पाने का एकमात्र तरीका सोमवार को सप्ताह भी शुरू होता है। (मुझे याद है कि डच सप्ताह संख्या बिल्कुल आईएसओ सप्ताह संख्या की तरह नहीं हैं, लेकिन यह एक अलग कहानी है)। तो आप वास्तव में क्या विशेषता खो रहे हैं?

संपादित करें तो समस्या (केवल?) है कि relative datetime formats, जैसे कि "सोमवार इस सप्ताह" गलत परिणाम देता है जब संदर्भ दिनांक रविवार होता है। डॉक्स से यह DateTime जैसा लगता है बस strtotime पर रोकता है, जिसे लोकेल-निर्भर माना जाता है। तो यदि आपके पास अपना लोकेल ठीक से सेट है और यह काम नहीं कर रहा है, तो यह एक बग की तरह लगता है (इसके लिए क्या लायक है)।

+1

इसे आजमाएं: $ test = new DateTime ('2012-11-04'); echo $ test-> संशोधित करें ('इस सप्ताह सोमवार') -> प्रारूप ('वाई-एम-डी'); // 2012-11-05 // मुझे 2012-10-29 – Edward

+1

मिलने की उम्मीद है; इसलिए रिश्तेदार ऑफसेट के लिए अंग्रेजी विनिर्देश सोमवार-प्रथम संस्करण में नहीं आते हैं। – alexis

+0

बिल्कुल .... उन सभी देशों के लिए बेकार है जो सोमवार को सप्ताह के पहले दिन मानते हैं। और मुझे पता चला कि PHP डेटटाइम एक्सटेंशन डच लड़के द्वारा लिखा गया था .... #WayToGoDerickRethans – Edward