2012-03-05 18 views
49

मैं एक तारीख लेना चाहता हूं और किस सप्ताह की संख्या का काम करना चाहता हूं।एक तिथि से सप्ताह संख्या (वर्ष में) प्राप्त करें PHP

अब तक मैं है अब तक, यह 24 लौटने जब यह 42.

<?php 
$ddate = "2012-10-18"; 
$duedt = explode("-",$ddate); 
$date = mktime(0, 0, 0, $duedt[2], $duedt[1],$duedt[0]); 
$week = (int)date('W', $date); 
echo "Weeknummer: ".$week; 
?> 

यह गलत है और एक संयोग नहीं है कि संख्या उलट कर रहे हैं होना चाहिए है? या मैं लगभग वहाँ हूँ?

+2

बस जोड़ने के लिए, PHP.ini का उपयोग करके या date_default_timezone_set ('एशिया/सिंगापुर') के माध्यम से टाइमज़ोन सेट करना न भूलें; – fedmich

उत्तर

109

आज, पीएचपी के DateTime वस्तुओं का उपयोग कर बेहतर है:

<?php 
$ddate = "2012-10-18"; 
$date = new DateTime($ddate); 
$week = $date->format("W"); 
echo "Weeknummer: $week"; 

क्योंकि mktime() में, यह इस प्रकार है यह:

mktime(hour, minute, second, month, day, year); 

इसलिए, अपने आदेश गलत है।

<?php 
$ddate = "2012-10-18"; 
$duedt = explode("-", $ddate); 
$date = mktime(0, 0, 0, $duedt[1], $duedt[2], $duedt[0]); 
$week = (int)date('W', $date); 
echo "Weeknummer: " . $week; 
?> 
+3

का उपयोग करना संभव है आप कार्बन का उपयोग कर सकते हैं, "https: // github.com/briannesbitt/Carbon "तिथि कुशलता में अपने कौशल को अधिकतम करने के लिए। कार्बन के लिए आप इसे कर सकते हैं: 'कार्बन :: createFromFormat (' Ymd H ',' 2012-10-18 ') -> प्रारूप (' डब्ल्यू '); ' – lukaserat

+18

असल में, आप PHP के मूल दिनांक समय का उपयोग कर बेहतर हैं वस्तुओं। –

+2

@lukaserat यह स्वीकार किया गया है कि स्वीकार्य उत्तर का उपयोग करने से कोई अलग कैसे है (तथ्य के अलावा ओपी को उस भाषा के लिए बाहरी निर्भरता शामिल करना है जो पहले से ही भाषा में मूल है)? – PeeHaa

0

नियम यह है कि एक वर्ष का पहला सप्ताह सप्ताह का पहला गुरुवार होता है।

मैं व्यक्तिगत रूप से इस तरह की गणना के लिए ज़ेंड_Date का उपयोग करता हूं और आज के लिए सप्ताह प्राप्त करना यह आसान है। यदि आप तिथियों के साथ काम करते हैं तो उनके पास कई अन्य उपयोगी कार्य हैं।

$now = Zend_Date::now(); 
$week = $now->get(Zend_Date::WEEK); 
// 10 
+0

यह एक नियम है (आईएसओ 8601 से, भाग में)। यही है कि PHP की तारीख ('डब्ल्यू', $ तारीख) 'पर आधारित है। हालांकि, यह एकमात्र नियम नहीं है। –

+0

मेरे पास अलग-अलग वर्ष डेटा हैं, क्या तारीख ('डब्ल्यू', $ तारीख) –

0

आपका कोड काम करेगा लेकिन आपको चौथा और 5 वां तर्क फ़्लिप करने की आवश्यकता है।

मैं इसे इस तरह से

$date_string = "2012-10-18"; 
$date_int = strtotime($date_string); 
$date_date = date($date_int); 
$week_number = date('W', $date_date); 
echo "Weeknumber: {$week_number}."; 

भी करना होगा, अपने चर के नामों का कोड पर नहीं करने के एक सप्ताह के बाद आप को भ्रमित हो जाएगा, आप पढ़ http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/

+0

http://php.net/manual/en/function.mktime.php – Jake

0
<?php 
$ddate = "2012-10-18"; 
$duedt = explode("-",$ddate); 
$date = mktime(0, 0, 0, $duedt[1], $duedt[2],$duedt[0]); 
$week = (int)date('W', $date); 
echo "Weeknummer: ".$week; 
?> 

आप पैरामीटर गलत mktime पड़ा - होने का महीना/दिन/वर्ष, नहीं दिन/माह/वर्ष की जरूरत है

45
$date_string = "2012-10-18"; 
echo "Weeknummer: " . date("W", strtotime($date_string)); 
5

यह मिलता है आज की तारीख तो सप्ताह के नंबर सप्ताह

<?php 
$date=date("W"); 
echo $date." Week Number"; 
?> 
0

दिया एन सप्ताह के लिए इस वर्ष के सप्ताह गिना जा रहा है के लिए पहले वर्तमान सप्ताह से पीएचपी

में

Get Week (N) ago from current week of the year

बता
+1

हाय और स्टैक ओवरफ़्लो में आपका स्वागत है। कृपया ध्यान दें कि आपका उत्तर यहां रहता है, लिंक और इसकी सामग्री बदल सकती है या हटा दी जा सकती है। कृपया उस लिंक से प्रासंगिक जानकारी शामिल करने के लिए अपना कोड संपादित करें। – Noich

6

बस एक सुझाव के रूप में:

<?php echo date("W", strtotime("2012-10-18")); ?> 

उन सभी की तुलना में थोड़ा आसान हो सकता है।

अन्य चीजें आप कर सकता है:

<?php echo date("Weeknumber: W", strtotime("2012-10-18 01:00:00")); ?> 
<?php echo date("Weeknumber: W", strtotime($MY_DATE)); ?> 
-1
function last_monday($date) 
{ 
    if (!is_numeric($date)) 
     $date = strtotime($date); 
    if (date('w', $date) == 1) 
     return $date; 
    else 
     return date('Y-m-d',strtotime('last monday',$date)); 
} 
$date = '2021-01-04'; //Enter custom date 
$year = date('Y',strtotime($date)); 
$date1 = new DateTime($date); 
$ldate = last_monday($year."-01-01"); 
$date2 = new DateTime($ldate); 
$diff = $date2->diff($date1)->format("%a"); 
$diff = $diff/7; 
$week = intval($diff) + 1; 
echo $week; 
//Returns 2. 
0

कोशिश इस समाधान

date('W', strtotime("2017-01-01 + 1 day")); 
0

मैं अब साल के लिए इस सवाल को हल करने की कोशिश की है, मैंने सोचा कि मैं एक छोटा समाधान पाया, लेकिन था लंबी कहानी में फिर से वापस आना। इस समारोह वापस सही ISO सप्ताह अंकन देता है:

/** 
* calcweek("2018-12-31") => 1901 
* This function calculates the production weeknumber according to the start on 
* monday and with at least 4 days in the new year. Given that the $date has 
* the following format Y-m-d then the outcome is and integer. 
* 
* @author M.S.B. Bachus 
* 
* @param date-notation PHP "Y-m-d" showing the data as yyyy-mm-dd 
* @return integer 
**/ 
function calcweek($date) { 
    // 1. Convert input to $year, $month, $day 
    $dateset  = strtotime($date); 
    $year   = date("Y", $dateset); 
    $month  = date("m", $dateset); 
    $day   = date("d", $dateset); 

    $referenceday = getdate(mktime(0,0,0, $month, $day, $year)); 
    $jan1day  = getdate(mktime(0,0,0,1,1,$referenceday[year])); 

    // 2. check if $year is a leapyear 
    if (($year%4==0 && $year%100!=0) || $year%400==0) { 
    $leapyear = true; 
    } else { 
    $leapyear = false; 
    } 

    // 3. check if $year-1 is a leapyear 
    if ((($year-1)%4==0 && ($year-1)%100!=0) || ($year-1)%400==0) { 
    $leapyearprev = true; 
    } else { 
    $leapyearprev = false; 
    } 

    // 4. find the dayofyearnumber for y m d 
    $mnth = array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334); 
    $dayofyearnumber = $day + $mnth[$month-1]; 
    if ($leapyear && $month > 2) { $dayofyearnumber++; } 

    // 5. find the jan1weekday for y (monday=1, sunday=7) 
    $yy = ($year-1)%100; 
    $c = ($year-1) - $yy; 
    $g = $yy + intval($yy/4); 
    $jan1weekday = 1+((((intval($c/100)%4)*5)+$g)%7); 

    // 6. find the weekday for y m d 
    $h = $dayofyearnumber + ($jan1weekday-1); 
    $weekday = 1+(($h-1)%7); 

    // 7. find if y m d falls in yearnumber y-1, weeknumber 52 or 53 
    $foundweeknum = false; 
    if ($dayofyearnumber <= (8-$jan1weekday) && $jan1weekday > 4) { 
    $yearnumber = $year - 1; 
    if ($jan1weekday = 5 || ($jan1weekday = 6 && $leapyearprev)) { 
     $weeknumber = 53; 
    } else { 
     $weeknumber = 52; 
    } 
    $foundweeknum = true; 
    } else { 
    $yearnumber = $year; 
    } 

    // 8. find if y m d falls in yearnumber y+1, weeknumber 1 
    if ($yearnumber == $year && !$foundweeknum) { 
    if ($leapyear) { 
     $i = 366; 
    } else { 
     $i = 365; 
    } 
    if (($i - $dayofyearnumber) < (4 - $weekday)) { 
     $yearnumber = $year + 1; 
     $weeknumber = 1; 
     $foundweeknum = true; 
    } 
    } 

    // 9. find if y m d falls in yearnumber y, weeknumber 1 through 53 
    if ($yearnumber == $year && !$foundweeknum) { 
    $j = $dayofyearnumber + (7 - $weekday) + ($jan1weekday - 1); 
    $weeknumber = intval($j/7); 
    if ($jan1weekday > 4) { $weeknumber--; } 
    } 

    // 10. output iso week number (YYWW) 
    return ($yearnumber-2000)*100+$weeknumber; 
} 

मुझे पता चला कि मेरे छोटे से समाधान 2018/12/31 याद के रूप में यह वापस 1901 के बजाय 1801 दिया तो मैं इस लंबे संस्करण में डाल करने के लिए किया था जो सही है।

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