tiene semanas semana saber que obtener numero mes estamos cuantas año actual php date

saber - obtener semanas del mes php



PHP obtiene el número de semana por mes (28)

Aquí viene dos líneas:

function getWeekOfMonth(DateTime $date) { $firstDayOfMonth = new DateTime($date->format(''Y-m-1'')); return ceil(($firstDayOfMonth->format(''N'') + $date->format(''j'') - 1) / 7); }

Y las soluciones de Wtower no funcionan al 100% correctamente.

Así que tengo un script que devuelve el número de semanas en un mes y año en particular. ¿Cómo puedo tomar un día específico de ese mes y determinar si es parte de la semana 1, 2, 3, 4 o 5 de ese mes?


Corto y a prueba de tontos:

// Function accepts $date as a string, // Returns the week number in which the given date falls. // Assumed week starts on Sunday. function wom($date) { $date = strtotime($date); $weeknoofday = date(''w'', $date); $day = date(''j'', $date); $weekofmonth = ceil(($day + (7-($weeknoofday+1))) / 7); return $weekofmonth; } // Test foreach (range(1, 31) as $day) { $test_date = "2015-01-" . str_pad($day, 2, ''0'', STR_PAD_LEFT); echo "$test_date - "; echo wom($test_date) . "/n"; }


Creo esta función, de brasil :) Espero que sea útil

function weekofmonth($time) { $firstday = 1; $lastday = date(''j'',$time); $lastdayweek = 6; //Saturday $week = 1; for ($day=1;$day<=$lastday;$day++) { $timetmp = mktime(0, 0, 0, date(''n'',$time), $day, date(''Y'',$time)); if (date(''N'',$timetmp) == $lastdayweek) { $week++; } } if (date(''N'',$time)==$lastdayweek) { $week--; } return $week; } $time = mktime(0, 0, 0, 9, 30, 2014); echo weekofmonth($time);


Creo que encontré una solución elegante

$time = time(); // or whenever $week_of_the_month = ceil(date(''d'', $time)/7);


Después de un montón de efoort encontré la solución

<?php function getWeeks($month,$year) { $month = intval($month); //force month to single integer if ''0x'' $suff = array(''st'',''nd'',''rd'',''th'',''th'',''th''); //week suffixes $end = date(''t'',mktime(0,0,0,$month,1,$year)); //last date day of month: 28 - 31 $start = date(''w'',mktime(0,0,0,$month,1,$year)); //1st day of month: 0 - 6 (Sun - Sat) $last = 7 - $start; //get last day date (Sat) of first week $noweeks = ceil((($end - ($last + 1))/7) + 1); //total no. weeks in month $output = ""; //initialize string $monthlabel = str_pad($month, 2, ''0'', STR_PAD_LEFT); for($x=1;$x<$noweeks+1;$x++) { if($x == 1) { $startdate = "$year-$monthlabel-01"; $day = $last - 6; } else { $day = $last + 1 + (($x-2)*7); $day = str_pad($day, 2, ''0'', STR_PAD_LEFT); $startdate = "$year-$monthlabel-$day"; } if($x == $noweeks) { $enddate = "$year-$monthlabel-$end"; } else { $dayend = $day + 6; $dayend = str_pad($dayend, 2, ''0'', STR_PAD_LEFT); $enddate = "$year-$monthlabel-$dayend"; } $j=1; if($j--) { $k=getTotalDate($startdate,$enddate); $j=1; } $output .= "Week ".$xyz." week -> Start date=$startdate End date=$enddate <br />"; } return $output; } if(isset($_POST) && !empty($_POST)){ $month = $_POST[''m'']; $year = $_POST[''y'']; echo getWeeks($month,$year); } ?> <form method="post"> M: <input name="m" value="" /> Y: <input name="y" value="" /> <input type="submit" value="go" /> </form>


Editar: tanto para "una sola línea" - variables necesarias para evitar el recálculo con el condicional. Lanzado en un argumento predeterminado mientras estaba en eso.

function weekOfMonth($when = null) { if ($when === null) $when = time(); $week = date(''W'', $when); // note that ISO weeks start on Monday $firstWeekOfMonth = date(''W'', strtotime(date(''Y-m-01'', $when))); return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth); }

Tenga en cuenta que weekOfMonth(strtotime(''Oct 31, 2011'')); devolverá 6 ; algunos meses excepcionales tienen 6 semanas en ellos, contrariamente a las expectativas de OP. Enero de 2017 es otro mes con 6 semanas ISO: el domingo 1º cae en la semana del último año, ya que las semanas ISO comienzan el lunes.

Para starshine531 , para devolver una 0 semana indexada del mes, cambie el resultado return 1 + para return 0 + o return (int) .

Para Justin Stayton , durante semanas que comienzan el domingo en lugar de los lunes, utilizaría strftime(''%U'' lugar de date(''W'' siguiente manera:

function weekOfMonth($when = null) { if ($when === null) $when = time(); $week = strftime(''%U'', $when); // weeks start on Sunday $firstWeekOfMonth = strftime(''%U'', strtotime(date(''Y-m-01'', $when))); return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth); }

Para esta versión, 2017-04-30 está ahora en la semana 6 de abril, mientras que 2017-01-31 está ahora en la semana 5.



Encontré una forma fácil de determinar qué semana del mes de hoy es, y sería un pequeño cambio para que funcione en cualquier otra fecha. Estoy agregando mis dos centavos aquí porque creo que mi camino es mucho más compacto que los métodos enumerados.

$monthstart = date("N",strtotime(date("n/1/Y"))); $date =( date("j")+$monthstart ) /7; $ddate= floor( $date ); if($ddate != date) {$ddate++;}

y $ ddate contiene el número de semana que podría modificarlo como tal

function findweek($indate) { $monthstart = date("N",strtotime(date("n/1/Y",strtotime($indate)))); $date =( date("j",strtotime($indate))+$monthstart ) /7; $ddate= floor( $date ); if($ddate != $date) {$ddate++;} return $ddate; }

y devolvería la semana del mes en cualquier fecha que le des. lo que hace es encontrar primero el número de días desde el comienzo de la semana hasta el primero del mes. luego agrega que a la fecha actual divide la nueva fecha entre 7 y eso le indicará cuántas semanas han transcurrido desde el inicio del mes, incluido un lugar decimal para la parte de la semana actual que ha pasado. Entonces, lo que hago a continuación es redondear ese número, luego comparar la versión redondeada hacia abajo con la original si los dos coinciden al final de la semana, por lo que ya está en el número. si no lo hacen, simplemente agregue uno al número redondeado y tendrá el número actual de la semana.


Esta es una solución basada en la solución matemática de sberry pero usando la clase PHP DateTime lugar.

function week_of_month($date) { $first_of_month = new DateObject($date->format(''Y/m/1'')); $day_of_first = $first_of_month->format(''N''); $day_of_month = $date->format(''j''); return floor(($day_of_first + $day_of_month - 1) / 7) + 1; }


Este es el fragmento que hice para cumplir mis requisitos para el mismo. Espero que esto te ayudará.

function getWeek($timestamp) { $week_year = date(''W'',$timestamp); $week = 0;//date(''d'',$timestamp)/7; $year = date(''Y'',$timestamp); $month = date(''m'',$timestamp); $day = date(''d'',$timestamp); $prev_month = date(''m'',$timestamp) -1; if($month != 1 ){ $last_day_prev = $year."-".$prev_month."-1"; $last_day_prev = date(''t'',strtotime($last_day_prev)); $week_year_last_mon = date(''W'',strtotime($year."-".$prev_month."-".$last_day_prev)); $week_year_first_this = date(''W'',strtotime($year."-".$month."-1")); if($week_year_first_this == $week_year_last_mon){ $week_diff = 0; } else{ $week_diff = 1; } if($week_year ==1 && $month == 12 ){ // to handle December''s last two days coming in first week of January $week_year = 53; } $week = $week_year-$week_year_last_mon + 1 +$week_diff; } else{ // to handle first three days January coming in last week of December. $week_year_first_this = date(''W'',strtotime($year."-01-1")); if($week_year_first_this ==52 || $week_year_first_this ==53){ if($week_year == 52 || $week_year == 53){ $week =1; } else{ $week = $week_year + 1; } } else{ $week = $week_year; } } return $week;

}


La solución de Srahul07 funciona perfectamente ... ¡ Si respetas el sistema de la semana de lunes a domingo! Aquí en ''murica, la gente que no es de negocios tiende a ir de domingo a sábado por una semana, por lo que el 1 de mayo de 2011 es la semana 1 y el 2 de mayo de 2011 es todavía la semana 1.

Agregar la siguiente lógica al final de su función, justo antes de que regrese $ week, convertirá esto a un sistema Sunday -> Monday:

if (!date(''w'',strtotime("$year-$month-01")) && date(''w'',$timestamp)) $week--; elseif (date(''w'',strtotime("$year-$month-01")) && !date(''w'',$timestamp)) $week++;


Lo más frustrante que he tratado de hacer funcionar, ¡pero aquí está!

<?php /** * Returns the amount of weeks into the month a date is * @param $date a YYYY-MM-DD formatted date * @param $rollover The day on which the week rolls over */ function getWeeks($date, $rollover) { $cut = substr($date, 0, 8); $daylen = 86400; $timestamp = strtotime($date); $first = strtotime($cut . "00"); $elapsed = ($timestamp - $first) / $daylen; $weeks = 1; for ($i = 1; $i <= $elapsed; $i++) { $dayfind = $cut . (strlen($i) < 2 ? ''0'' . $i : $i); $daytimestamp = strtotime($dayfind); $day = strtolower(date("l", $daytimestamp)); if($day == strtolower($rollover)) $weeks ++; } return $weeks; } // echo getWeeks("2011-06-11", "sunday"); //outputs 2, for the second week of the month ?>


Mis 5 centavos:

/** * calculate number of weeks in a particular month */ function weeksInMonth($month=null,$year=null){ if( null==($year) ) { $year = date("Y",time()); } if(null==($month)) { $month = date("m",time()); } // find number of days in this month $daysInMonths = date(''t'',strtotime($year.''-''.$month.''-01'')); $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7); $monthEndingDay= date(''N'',strtotime($year.''-''.$month.''-''.$daysInMonths)); $monthStartDay = date(''N'',strtotime($year.''-''.$month.''-01'')); if($monthEndingDay<$monthStartDay){ $numOfweeks++; } return $numOfweeks; }


Para una semana de lunes a domingo (ISO 8601) (o, si simplemente no le importa), puede hacer esto en una línea:

function get_week_of_month($date) { return date(''W'', $date) - date(''W'', strtotime(date("Y-m-01", $date))) + 1; }

( Source )

Para cualquier otra cosa (por ejemplo, una semana de domingo a sábado), solo necesita modificar $ date dentro de la función:

function get_week_of_month($date) { $date += 86400; //For weeks starting on Sunday return date(''W'', $date) - date(''W'', strtotime(date("Y-m-01", $date))) + 1; }

( Gracias a estos chicos / chicas )

NOTA: Es posible que tenga problemas al final del año (por ejemplo, alrededor del 12/31, 1/1, etc.). Leer más aquí.


Pensé que compartiría mi función también. Esto devuelve un conjunto de semanas. Cada semana hay una matriz con semanas (0,6) como clave y meses (1,31) como valor.

La función asume que la semana comienza con el domingo.

¡Disfrutar!

function get_weeks($year, $month){ $days_in_month = date("t", mktime(0, 0, 0, $month, 1, $year)); $weeks_in_month = 1; $weeks = array(); //loop through month for ($day=1; $day<=$days_in_month; $day++) { $week_day = date("w", mktime(0, 0, 0, $month, $day, $year));//0..6 starting sunday $weeks[$weeks_in_month][$week_day] = $day; if ($week_day == 6) { $weeks_in_month++; } } return $weeks; }


Probablemente esta no sea una buena manera de hacerlo, pero es mi primer pensamiento y estoy realmente cansado.

Pon todas tus fechas en una matriz. El objeto de fecha debe tener un nombre de día (lunes). Cree un método que busque en la matriz y, cuando llegue a un domingo, agregue 1 a un contador semanal. Una vez que encuentre la fecha que está buscando, regrese al contador semanal. Esa es la semana en que cae el día del año. Para la semana del mes, debe reiniciar el contador de la semana cada vez que llegue al último día de cada mes.


Realmente me gustó la respuesta de @michaelc. Sin embargo, me quedé estancado en algunos puntos. Parecía que cada vez que llegaba el domingo, había una compensación de uno. Creo que tiene que ver con qué día de la semana es el comienzo de la semana. En cualquier caso, aquí está mi ligera alteración, ampliada un poco para facilitar la lectura:

function wom(/DateTime $date) { // The week of the year of the current month $cw = date(''W'', $date->getTimestamp()); // The week of the year of the first of the given month $fw = date(''W'',strtotime(date(''Y-m-01'',$date->getTimeStamp()))); // Offset $o = 1; // If it is a Saturday, offset by two. if( date(''N'',$date->getTimestamp()) == 7 ) { $o = 2; } return $cw -$fw + $o; }

Entonces, si la fecha es el 9 de noviembre de 2013 ...

$cw = 45 $fw = 44

y con el desplazamiento de 1, devuelve correctamente 2.

Si la fecha es el 10 de noviembre de 2013, $cw y $fw son los mismos que antes, pero el desplazamiento es 2 y devuelve 3 correctamente.


Si entiendo lo correcto, la pregunta es cómo identificar qué cantidad de semanas dentro de un mes de un día específico ... Estaba buscando una solución similar. Usé algunas ideas de las respuestas anteriores para desarrollar mi propia solución. Espero que pueda ser útil para alguien. Si la respuesta es Sí, entonces UpVote mi respuesta.

function week_number_within_month($datenew){ $year = date("Y",strtotime($datenew)); $month = date("m",strtotime($datenew)); // find number of days in this month $daysInMonths = date(''t'',strtotime($year.''-''.$month.''-01'')); $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7); $monthEndingDay= date(''N'',strtotime($year.''-''.$month.''-''.$daysInMonths)); $monthStartDay = date(''N'',strtotime($year.''-''.$month.''-01'')); if($monthEndingDay<$monthStartDay){ $numOfweeks++; } $date=date(''Y/m/d'', strtotime($year.''-''. $month.''-01'')); $week_array=Array(); for ($i=1; $i<=$numOfweeks; $i++){ /// create an Array of all days of month separated by weeks as a keys $max = 7; if ($i ==1){ $max = 8 - $monthStartDay;} if ($i == $numOfweeks){ $max = $monthEndingDay;} for ($r=1; $r<=$max; $r++){ $week_array[$i][]=$date; $date = date(''Y/m/d'',strtotime($date . "+1 days")); } } $new_datenew = date(''Y/m/d'', strtotime($datenew)); $week_result=''''; foreach ($week_array as $key => $val){ /// finding what week number of my date from week_array foreach ($val as $kr => $value){ if ($new_datenew == $value){ $week_result = $key; } } } return $week_result; } print week_number_within_month(''2016-09-15'');


Solo copie y pase el código y pase el mes y el año.

por ejemplo, mes = 04 año = 2013.

Eso es exactamente lo que necesitas.

$mm= $_REQUEST[''month'']; $yy= $_REQUEST[''year'']; $startdate=date($yy."-".$mm."-01") ; $current_date=date(''Y-m-t''); $ld= cal_days_in_month(CAL_GREGORIAN, $mm, $yy); $lastday=$yy.''-''.$mm.''-''.$ld; $start_date = date(''Y-m-d'', strtotime($startdate)); $end_date = date(''Y-m-d'', strtotime($lastday)); $end_date1 = date(''Y-m-d'', strtotime($lastday." + 6 days")); $count_week=0; $week_array = array(); for($date = $start_date; $date <= $end_date1; $date = date(''Y-m-d'', strtotime($date. '' + 7 days''))) { $getarray=getWeekDates($date, $start_date, $end_date); echo "<br>"; $week_array[]=$getarray; echo "/n"; $count_week++; } // its give the number of week for the given month and year echo $count_week; //print_r($week_array); function getWeekDates($date, $start_date, $end_date) { $week = date(''W'', strtotime($date)); $year = date(''Y'', strtotime($date)); $from = date("Y-m-d", strtotime("{$year}-W{$week}+1")); if($from < $start_date) $from = $start_date; $to = date("Y-m-d", strtotime("{$year}-W{$week}-6")); if($to > $end_date) $to = $end_date; $array1 = array( "ssdate" => $from, "eedate" => $to, ); return $array1; // echo "Start Date-->".$from."End Date -->".$to; } for($i=0;$i<$count_week;$i++) { $start= $week_array[$i][''ssdate'']; echo "--"; $week_array[$i][''eedate'']; echo "<br>"; }

SALIDA:

week( 0 )=>2013-03-01---2013-03-02 week( 1 )=>2013-03-03---2013-03-09 week( 2 )=>2013-03-10---2013-03-16 week( 3 )=>2013-03-17---2013-03-23 week( 4 )=>2013-03-24---2013-03-30 week( 5 )=>2013-03-31---2013-03-31


Usando carbono:

$ date = Carbon :: now (); $ d1 = $ date-> startOfMonth (); $ d2 = $ date-> endOfMonth ();

$ weeks = $ d1-> diffInWeeks ($ d2);


Yo uso esta simple función:

function weekNumberInMonth($timestampDate) { $firstDayOfMonth = strtotime(date(''01-M-Y 00:00:00'', $timestampDate)); $firstWeekdayOfMonth = date( ''w'', $firstDayOfMonth); $dayNumberInMonth = date(''d'', $timestampDate); $weekNumberInMonth = ceil(($dayNumberInMonth + $firstWeekdayOfMonth) / 7); return $weekNumberInMonth; }


hay un problema con este método si la fecha de aprobación (digamos que 01/01/01 que es un domingo) y el día "$ rollover" es "domingo", entonces esta función devolverá 2. donde en realidad es 1 semana. Creo que lo he arreglado en la siguiente función. por favor agregue comentarios para mejorarlo.

function getWeeks($date, $rollover) { $cut = substr($date, 0, 8); $daylen = 86400; $timestamp = strtotime($date); $first = strtotime($cut . "01"); $elapsed = (($timestamp - $first) / $daylen)+1; $i = 1; $weeks = 0; for($i==1; $i<=$elapsed; $i++) { $dayfind = $cut . (strlen($i) < 2 ? ''0'' . $i : $i); $daytimestamp = strtotime($dayfind); $day = strtolower(date("l", $daytimestamp)); if($day == strtolower($rollover)) { $weeks++; } } if($weeks==0) { $weeks++; } return $weeks; }


puedes usar W en las versiones más nuevas de php. http://php.net/manual/en/function.date.php

lo he usado así:

function getWeek($date) { $month_start=strtotime("1 ".date(''F Y'',$date)); $current_date=strtotime(date(''j F Y'',$date)); $month_week=date("W",$month_start); $current_week=date("W",$current_date); return ($current_week-$month_week); }//0 is the week of the first.



/** * In case of Week we can get the week of year. So whenever we will get the week of the month then we have to * subtract the until last month weeks from it will give us the current month week. */ $dateComponents = getdate(); if($dateComponents[''mon''] == 1) $weekOfMonth = date(''W'', strtotime($dateComponents[''year''].''-''.$dateComponents[''mon''].''-''.$dateComponents[''mday'']))-1; // We subtract -1 to map it to the array else $weekOfMonth = date(''W'', strtotime($dateComponents[''year''].''-''.$dateComponents[''mon''].''-''.$dateComponents[''mday'']))-date(''W'', strtotime($dateComponents[''year''].''-''.$dateComponents[''mon''].''-01''));


function getWeekOfMonth(/DateTime $date) { $firstWeekdayOfMonth = new DateTime("first weekday 0 {$date->format(''M'')} {$date->format(''Y'')}"); $offset = $firstWeekdayOfMonth->format(''N'')-1; return intval(($date->format(''j'') + $offset)/7)+1; }


function get_week_of_month( $timestamp ) { $week_of_month = 0; $month = date( ''j'', $timestamp ); $test_month = $month; while( $test_month == $month ) { $week_of_month++; $timestamp = strtotime( ''-1 week'', $timestamp ); $test_month = date( ''j'', $timestamp ); } return $week_of_month; }


public function getWeeks($timestamp) { $maxday = date("t",$timestamp); $thismonth = getdate($timestamp); $timeStamp = mktime(0,0,0,$thismonth[''mon''],1,$thismonth[''year'']); //Create time stamp of the first day from the give date. $startday = date(''w'',$timeStamp); //get first day of the given month $day = $thismonth[''mday'']; $weeks = 0; $week_num = 0; for ($i=0; $i<($maxday+$startday); $i++) { if(($i % 7) == 0){ $weeks++; } if($day == ($i - $startday + 1)){ $week_num = $weeks; } } return $week_num; }

Hola a todos, he estado luchando todo el día tratando de descifrar este código, finalmente lo descubrí, así que pensé que podría compartirlo con todos ustedes.

todo lo que necesita hacer es poner un sello de tiempo en la función y le devolverá el número de la semana.

Gracias