2012-03-05 115 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('Asia/Singapore')設置時區; – fedmich 2014-02-27 01:17:56

回答

109

今天,使用PHP的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「,以最大限度地提高您在日期操作中的技能。對於碳你可以這樣做:'Carbon :: createFromFormat('Ymd H','2012-10-18') - > format('W');' – lukaserat 2014-05-04 07:20:55

+18

實際上,最好使用PHP的本地DateTime對象。 – 2014-05-04 07:28:07

+2

@lukaserat這與接受的答案使用的內容有什麼不同(除了OP必須包含外部依賴於某種已經在本地語言中的東西)? – PeeHaa 2014-07-27 14:23:33

0

規則是一年中的第一週是包含當年第一個星期四的那一週。

我個人使用Zend_Date進行這種計算並獲得今天的這一週很簡單。如果您使用日期,他們還有很多其他有用的功能。

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

這是一條規則(部分來自ISO 8601)。這就是PHP的'date('W',$ date)'所基於的。但這不是唯一的規則。 – 2012-03-05 13:51:43

+0

我有不同的年份數據,是可以使用日期('W',$ date) – 2014-01-07 09:44:44

0

您的代碼可以正常工作,但您需要翻轉第4個和第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 2012-03-05 13:51:11

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; 
?> 

你有PARAMS到mktime錯誤 - 必須是月/日/年,而不是日/月/年

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

這讓今天的日期,然後告訴週數爲一週

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

計算一年的一週指定N個星期前從當前周PHP

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

+1

嗨,歡迎來到Stack Overflow。請注意,雖然您的答案仍然存在,但鏈接及其內容可能會更改或刪除。 請修改您的代碼以包含該鏈接的相關信息。 – Noich 2014-02-19 11:36:36

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日,因爲它給了後面,而不是1801 1901於是,我只好把這個長的版本,是正確的。

相關問題