2011-06-25 14 views
5

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

महीने का अंतिम [DOW] (इसलिए अंतिम [सोम/मंगल/बुध/आदि] सप्ताह)

मुझे नियम स्वयं ही संग्रहीत कर चुका है, मुझे यकीन नहीं है कि PHP में महीने के आखिरी सोम/ट्यू/बुध को कैसे निकालना है? मैं गिर गया जैसे मैं इसे और अधिक जटिल बना रहा हूं इसकी आवश्यकता है।

मान लें कि आपके पास $month=4, $dow=3 और $year=2011 के लिए चर हैं, मैं यह कैसे करूँगा?

उत्तर

20

सब कुछ दिनांक से संबंधित है कि आप उचित अंग्रेजी में व्यक्त कर सकते हैं लेकिन संख्याओं का उपयोग करके कठिन समय लेना, strtotime आपका सबसे अच्छा दोस्त है।

echo strtotime("last Monday of June 2011"); 

यह एक टाइमस्टैम्प कि आप date को दूसरा पैरामीटर और पसंद के रूप में उपयोग कर सकते हैं एक उचित, मानव पठनीय तारीख पाने के लिए देता है। चूंकि यह सी में लिखा गया एक अंतर्निहित फ़ंक्शन है, इसलिए यह समाधान PHP में लिखे गए किसी भी चीज़ से कहीं अधिक तेज़ है (हालांकि मुझे पूरा यकीन है कि इससे वास्तविक दुनिया परिदृश्य में कोई फर्क नहीं पड़ता)।

तो यह सोचते हैं आप $month=4, $dow=3 और $year=2011 है, तो आप एक सरणी मानचित्रण अपने अंग्रेजी शाब्दिक अभ्यावेदन के लिए $month मूल्यों और एक अन्य सरणी मानचित्रण उनके शाब्दिक अभ्यावेदन के लिए $dow मूल्यों की आवश्यकता होगी।

+2

बस एक नोट के रूप में: सुनिश्चित करें कि आप भूल नहीं है '' '। – cwallenpoole

+0

आपको बहुत बहुत धन्यवाद! मैंने सोचा कि मैं इसे जटिल बना रहा था !! – TH1981

0

मेरे पास एक महीने के nth दिन की गणना करने के लिए आपके लिए एक सामान्य कार्य है। उम्मीद है कि यह आपकी समस्या को हल करने में आपकी मदद कर सकता है।

function get_Nth_dow($dow, $occurence, $m, $y) 
{ 
    $numdays = date('t', mktime(0, 0, 0, $m, 1, $y)); 
    $add = 7 * ($occurence - 1); 
    $firstdow = date('w', mktime(0, 0, 0, $m, 1, $y)); 
    $diff = $firstdow - $dow; 

    $day_of_month = 1; 
    if ($diff > 0) 
    { 
     $day_of_month += ($add - $diff); 
    } 
    elseif ($diff < $numdays) 
    { 
     $day_of_month -= ($diff - $add); 
    } 

    return $day_of_month; 
} 

$DOW = सप्ताह के दिन (0 = रविवार, 6 = शनिवार)।

$X = अवसर (1 = पहला, 2 = तीसरा, आदि ..)। यदि दिया गया महीना

घटना नहीं है, तो यह अंतिम लौटाएगा। उदाहरण के लिए, यदि

आप शुक्रवार की 7 वीं घटना के लिए पूछना, यह पिछले

शुक्रवार महीने के वापस आ जाएगी। $M = महीने $Y = साल

उदाहरण के लिए, get_Nth_DOW(2,3,7,2009) वापस आ जाएगी 7 वीं 2009

0

के तीसरे मंगलवार यहाँ एक विकल्प है:

<? 
function lastDayOfMonth($month, $year) { 
    switch ($month) { 
     case 2: 
      # if year is divisible by 4 and not divisible by 100 
      if (($year % 4 == 0) && ($year % 100) > 0) 
       return 29; 
      # or if year is divisible by 400 
      if ($year % 400 == 0) 
       return 29; 
      return 28; 
     case 4: 
     case 6: 
     case 9: 
     case 11: 
      return 30; 
     default: 
      return 31; 
    } 
} 

function lastDayOfWeek($month, $year, $dow) { 
    $d = new DateTime(); 

    #Finding the last day of month 
    $d = $d->setDate($year, $month, lastDayOfMonth($month, $year)); 

    #Getting the day of week of last day of month 
    $date_parts = getdate($d->getTimestamp()); 

    $diff = 0; 

    #if we can't find the $dow in this week... (cause it would lie on next month) 
    if ($dow > $date_parts['wday']) { 
     # ...we go back a week. 
     $diff -= 7; 
    } 

    return $date_parts['mday'] + $diff + ($dow - $date_parts['wday']); 
} 

# checking the algorithm for this month... 
for ($i=0; $i < 7; $i++) { 
    echo lastDayOfWeek(6,2011,$i) . "<br>"; 
} 

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