2012-03-05 55 views
49

Quiero tomar una fecha y averiguar qué número de semana es.Obtener el número de semana (en el año) a partir de una fecha PHP

Hasta ahora he hasta ahora, se está volviendo 24 cuando debería ser 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; 
?> 

es malo y una coincidencia que los números se invierten? ¿O estoy casi allí?

+2

Solo para agregar, no olvides configurar la zona horaria, usando PHP.ini o vía date_default_timezone_set ('Asia/Singapur'); – fedmich

Respuesta

109

Hoy en día, el uso de DateTime objetos de PHP es mejor:

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

es porque en mktime(), que es la siguiente:

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

por lo tanto, su orden es incorrecto.

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

Puede usar Carbon, "https: // github.com/briannesbitt/Carbon "para maximizar tus habilidades en la manipulación de fechas. Para el carbono, puedes hacerlo mediante: 'Carbon :: createFromFormat ('Ymd H', '2012-10-18') -> format ('W');' – lukaserat

+18

En realidad, es mejor que solo uses el formato nativo de PHP DateTime objetos. –

+2

@lukaserat ¿Cómo es eso diferente de lo que usa la respuesta aceptada (además del hecho de que OP debe incluir una dependencia externa para algo que ya es nativo en el lenguaje)? – PeeHaa

0

La regla es que la primera semana de un año es la semana que contiene el primer jueves del año.

Yo personalmente uso Zend_Date para este tipo de cálculo y para obtener la semana para hoy es así de simple. Tienen muchas otras funciones útiles si trabajas con fechas.

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

Esa es una regla (de ISO 8601, en parte). Eso es en lo que se basa la 'fecha ('W', $ date)' de php. Sin embargo, esa no es la única regla. –

+0

tengo datos de años diferentes, es posible usar la fecha ('W', $ date) –

0

Tu código funcionará, pero debes voltear el 4to y el 5to argumento.

lo haría de esta manera

$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}."; 

Además, los nombres de las variables serán confuso para usted después de una semana de no mirar en ese código, debería considerar leer función de la fecha 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; 
?> 

usted tenía el params a mktime mal - tiene que ser mes/día/año, no día/mes/año

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

Esta fecha conseguir hoy en día se dice el número de semanas para la semana

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

Cálculo de semana del año por semana dada N atrás desde la semana actual en PHP

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

+1

Hola y bienvenidos a Stack Overflow. Tenga en cuenta que mientras su respuesta permanezca aquí, el enlace y su contenido pueden cambiar o eliminarse. Por favor, edite su código para incluir la información relevante de ese enlace. – Noich

6

Solo como sugerencia:

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

Podría ser un poco más simple que todo ese lote.

Otras cosas que podría hacer:

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

probar esta solución

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

he tratado de resolver esta cuestión desde hace años, pensé que encontró una solución más corto, pero tenía para volver a la larga historia. Esta función devuelve el derecho ISO semana notación:

/** 
* 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; 
} 

descubrí que mi solución a corto perdió el 31/12/2018, ya que devolvió 1801 en lugar de 1901. Por lo tanto, tuvo que poner en esta versión larga, que es correcto.

Cuestiones relacionadas