numero - Obtener el número de semana(en el año) a partir de una fecha PHP
strtotime php ejemplos (11)
Quiero tomar una cita y calcular su número de semana.
Hasta ahora, tengo lo siguiente. Devuelve 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;
?>
¿Está mal y es una coincidencia que los dígitos estén invertidos? ¿O estoy casi allí?
Intenté resolver esta pregunta durante años, creí encontrar una solución más corta, pero tuve que volver a la larga historia. Esta función devuelve la notación semanal ISO correcta:
/**
* 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 corta se perdió el 2018-12-31 ya que devolvió 1801 en lugar de 1901. Así que tuve que poner esta versión larga que es correcta.
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 de 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
Obtenga la fecha de hoy y luego indique el número de semana de la semana
<?php
$date=date("W");
echo $date." Week Number";
?>
Solo como sugerencia:
<?php echo date("W", strtotime("2012-10-18")); ?>
Puede ser un poco más simple que todo eso.
Otras cosas que podrías hacer:
<?php echo date("Weeknumber: W", strtotime("2012-10-18 01:00:00")); ?>
<?php echo date("Weeknumber: W", strtotime($MY_DATE)); ?>
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, sus nombres de variables le resultarán confusos después de una semana de no mirar ese código, debe considerar leer http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/
Use la función de fecha de PHP
http://php.net/manual/en/function.date.php
date("W", $yourdate)
prueba esta solución
date( ''W'', strtotime( "2017-01-01 + 1 day" ) );
Hoy, usar los objetos DateTime
de PHP es mejor:
<?php
$ddate = "2012-10-18";
$date = new DateTime($ddate);
$week = $date->format("W");
echo "Weeknummer: $week";
Es porque en mktime()
, dice así:
mktime(hour, minute, second, month, day, year);
Por lo tanto, su orden es incorrecta.
<?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;
?>
$date_string = "2012-10-18";
echo "Weeknummer: " . date("W", strtotime($date_string));
<?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;
?>
Tuviste los parámetros de mktime incorrectos: debe ser Mes / Día / Año, no Día / Mes / Año.
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.