todas obtener las hora formato fechas fecha español entre actual php datetime date-range

obtener - PHP: devuelve todas las fechas entre dos fechas en una matriz



obtener todas las fechas entre dos fechas php (24)

Entrada esperada:

getDatesFromRange( ''2010-10-01'', ''2010-10-05'' );

Rendimiento esperado:

Array( ''2010-10-01'', ''2010-10-02'', ''2010-10-03'', ''2010-10-04'', ''2010-10-05'' )


Me encanta un sólido one-liner!

Mi descubrimiento php del día fue que array_push() devuelve la nueva cantidad de elementos en la matriz.

Me las arreglé para verificar la coincidencia de la fecha de finalización, incrementar $ x e insertar nuevos elementos dentro de la declaración de condición de dos partes de un ciclo while vacío.

function getDatesFromRange($a,$b,$x=0,$dates=[]){ while(end($dates)!=$b && $x=array_push($dates,date("Y-m-d",strtotime("$a +$x day")))); return $dates; } var_export(getDatesFromRange(''2010-10-01'',''2010-10-05''));

La función más similar a la mía en esta página es la de drolex (que en realidad no encontré hasta después de que escribí la mía, si me crees). Realicé algunas pruebas de velocidad en intervalos de fechas grandes y pequeños y parecen vencerse con la misma frecuencia, por lo que los llamo "intérpretes iguales". Aquí hay algunas otras comparaciones:

  • Ambos usamos date() , strtotime() y dos funciones de matriz.
  • Drolex usa solo tres variables, yo uso las mismas tres más $x .
  • Debido a que no es necesario cargar la fecha de inicio en la matriz de $date para mi función, puedo declararla en los parámetros de la función y reservar la línea (del mismo modo con $x ).

** Solo un par de notas importantes:

1- Las cadenas de fechas DEBEN SER validadas antes de ser alimentadas a la función.

2- La función anterior solo puede manejar los rangos de fechas de movimiento hacia adelante. Si desea un intervalo de fechas de movimiento hacia atrás, simplemente invierta el orden de fecha en la llamada de función y agregue un signo menos después de $x= . (Bastante astuto, ¿eh?)

function getDatesFromRange($a,$b,$x=0,$dates=[]){ while(end($dates)!=$b && $x=-array_push($dates,date("Y-m-d",strtotime("$a +$x day")))); return $dates; } var_export(getDatesFromRange(''2010-10-05'',''2010-10-01''));

Una extensión más / consideración ...

Imagine que tiene una base de usuarios multicultural (o descuidada), y su función DEBE poder recibir las fechas de inicio y finalización en diferentes formatos válidos Y debe poder generar la matriz en cualquiera de los formatos válidos? Mediante un ajuste menor, he proporcionado una solución para eso.

Por "válido" me refiero a YYYY-MM-DD , MM/DD/YYY y DD-MM-YYYY , estos son los estándares masivamente populares en todo el mundo, si se necesita otro formato, la usabilidad se strtotime la comprensión de strtotime de eso.

Aquí está la Demo .

Código:

function getDatesFromRange($a,$b,$format=''Y-m-d'',$dates=[],$x=0){ while(date($format,strtotime(end($dates)))!=date($format,strtotime($b)) && $x=array_push($dates,date($format,strtotime("$a +$x day")))); return $dates; } $formats=array("Computer"=>''Y-m-d'',"American"=>''m/d/Y'',''Non-American''=>''d-m-Y''); $start=''15-02-2017''; // Non-American formatted start date $end=''2017-02-27''; // Computer formatted start date foreach($formats as $label=>$format){ echo "<br>$label<br>"; var_export(getDatesFromRange($start,$end,$format)); echo "<br>"; }

Salida

Computer array ( 0 => ''2017-02-15'', 1 => ''2017-02-16'', 2 => ''2017-02-17'', 3 => ''2017-02-18'', 4 => ''2017-02-19'', 5 => ''2017-02-20'', 6 => ''2017-02-21'', 7 => ''2017-02-22'', 8 => ''2017-02-23'', 9 => ''2017-02-24'', 10 => ''2017-02-25'', 11 => ''2017-02-26'', 12 => ''2017-02-27'', ) American array ( 0 => ''02/15/2017'', 1 => ''02/16/2017'', 2 => ''02/17/2017'', 3 => ''02/18/2017'', 4 => ''02/19/2017'', 5 => ''02/20/2017'', 6 => ''02/21/2017'', 7 => ''02/22/2017'', 8 => ''02/23/2017'', 9 => ''02/24/2017'', 10 => ''02/25/2017'', 11 => ''02/26/2017'', 12 => ''02/27/2017'', ) Non-American array ( 0 => ''15-02-2017'', 1 => ''16-02-2017'', 2 => ''17-02-2017'', 3 => ''18-02-2017'', 4 => ''19-02-2017'', 5 => ''20-02-2017'', 6 => ''21-02-2017'', 7 => ''22-02-2017'', 8 => ''23-02-2017'', 9 => ''24-02-2017'', 10 => ''25-02-2017'', 11 => ''26-02-2017'', 12 => ''27-02-2017'', )

Ahora, algunas personas no confían 100% strtotime () debido a algunos comportamientos erróneos. Creo que he leído que se estropeará cuando intente saltar un mes después de un día bisiesto. Sin embargo, a menos que alguien pueda reproducirlo para demostrar que estoy equivocado, strtotime () nunca te defraudará cuando solo estés aumentando un día.


Aquí está la otra solución. Por favor, chequee esto.

$first = ''10/30/2017''; //starting date $last= ''10/11/2017''; //ending date $first_time_arr=explode(''/'',$first); $last_time_arr=explode(''/'',$last); //create timestamp of starting date $start_timestamp=mktime(0,0,0, $first_time_arr[0], $first_time_arr[1],$first_time_arr[2]); //create timestamp of ending date $end_timestamp=mktime(0,0,0, $last_time_arr[0], $last_time_arr[1],$last_time_arr[2]); $date_arr=array(); for($i=$start_timestamp;$i<=$end_timestamp;$i=$i+86400){ $date_arr[]=date("Y-m-d",$i); //this will save all dates in array }


Aquí hay una forma de hacerlo usando Carbon https://github.com/briannesbitt/Carbon :

public function buildDateRangeArray($first, $last) { while ($first <= $last) { $dates[] = $first->toDateString(); $first->addDay(); } return $dates; }

Esto, por supuesto, puede ajustarse para no usar carbono. Los parámetros $ first y $ last pasados ​​a la función son instancias de Carbon.


Aquí hay una función que devolverá rangos de fechas en ambas direcciones y funciona en PHP> = 5.2.2 :

function createRange($start, $end, $format = ''Y-m-d'') { $start = new DateTime($start); $end = new DateTime($end); $invert = $start > $end; $dates = array(); $dates[] = $start->format($format); while ($start != $end) { $start->modify(($invert ? ''-'' : ''+'') . ''1 day''); $dates[] = $start->format($format); } return $dates; }

Use el ejemplo:

print_r(createRange(''2010-10-01'', ''2010-10-05'')); /*Array ( [0] => 2010-10-01 [1] => 2010-10-02 [2] => 2010-10-03 [3] => 2010-10-04 [4] => 2010-10-05 )*/ print_r(createRange(''2010-10-05'', ''2010-10-01'', ''j M Y'')); /*Array ( [0] => 5 Oct 2010 [1] => 4 Oct 2010 [2] => 3 Oct 2010 [3] => 2 Oct 2010 [4] => 1 Oct 2010 )*/

demo


Creo que es la respuesta más corta

Edita el código como quieras

for ($x=strtotime(''2015-12-01'');$x<=strtotime(''2015-12-30'');$x+=86400) echo date(''Y-m-d'',$x);


Esto es corto, dulce, y debería funcionar en PHP4 +.

function getDatesFromRange($start, $end){ $dates = array($start); while(end($dates) < $end){ $dates[] = date(''Y-m-d'', strtotime(end($dates).'' +1 day'')); } return $dates; }


Esto es muy muy flexible.

/** * Creating date collection between two dates * * <code> * <?php * # Example 1 * date_range("2014-01-01", "2014-01-20", "+1 day", "m/d/Y"); * * # Example 2. you can use even time * date_range("01:00:00", "23:00:00", "+1 hour", "H:i:s"); * </code> * * @author Ali OYGUR <[email protected]> * @param string since any date, time or datetime format * @param string until any date, time or datetime format * @param string step * @param string date of output format * @return array */ function date_range($first, $last, $step = ''+1 day'', $output_format = ''d/m/Y'' ) { $dates = array(); $current = strtotime($first); $last = strtotime($last); while( $current <= $last ) { $dates[] = date($output_format, $current); $current = strtotime($step, $current); } return $dates; }


Función corta PHP 5.3 y más. Puede tomar el tercer parámetro opcional de cualquier formato de fecha que strtotime pueda entender. Invierte automáticamente la dirección si end <start.

function getDatesFromRange($start, $end, $format=''Y-m-d'') { return array_map(function($timestamp) use($format) { return date($format, $timestamp); }, range(strtotime($start) + ($start < $end ? 4000 : 8000), strtotime($end) + ($start < $end ? 8000 : 4000), 86400)); }

Prueba:

date_default_timezone_set(''Europe/Berlin''); print_r(getDatesFromRange( ''2016-7-28'',''2016-8-2'' )); print_r(getDatesFromRange( ''2016-8-2'',''2016-7-28'' )); print_r(getDatesFromRange( ''2016-10-28'',''2016-11-2'' )); print_r(getDatesFromRange( ''2016-11-2'',''2016-10-28'' )); print_r(getDatesFromRange( ''2016-4-2'',''2016-3-25'' )); print_r(getDatesFromRange( ''2016-3-25'',''2016-4-2'' )); print_r(getDatesFromRange( ''2016-8-2'',''2016-7-25'' )); print_r(getDatesFromRange( ''2016-7-25'',''2016-8-2'' ));

Salida:

Array ( [0] => 2016-07-28 [1] => 2016-07-29 [2] => 2016-07-30 [3] => 2016-07-31 [4] => 2016-08-01 [5] => 2016-08-02 ) Array ( [0] => 2016-08-02 [1] => 2016-08-01 [2] => 2016-07-31 [3] => 2016-07-30 [4] => 2016-07-29 [5] => 2016-07-28 ) Array ( [0] => 2016-10-28 [1] => 2016-10-29 [2] => 2016-10-30 [3] => 2016-10-31 [4] => 2016-11-01 [5] => 2016-11-02 ) Array ( [0] => 2016-11-02 [1] => 2016-11-01 [2] => 2016-10-31 [3] => 2016-10-30 [4] => 2016-10-29 [5] => 2016-10-28 ) Array ( [0] => 2016-04-02 [1] => 2016-04-01 [2] => 2016-03-31 [3] => 2016-03-30 [4] => 2016-03-29 [5] => 2016-03-28 [6] => 2016-03-27 [7] => 2016-03-26 [8] => 2016-03-25 ) Array ( [0] => 2016-03-25 [1] => 2016-03-26 [2] => 2016-03-27 [3] => 2016-03-28 [4] => 2016-03-29 [5] => 2016-03-30 [6] => 2016-03-31 [7] => 2016-04-01 [8] => 2016-04-02 ) Array ( [0] => 2016-08-02 [1] => 2016-08-01 [2] => 2016-07-31 [3] => 2016-07-30 [4] => 2016-07-29 [5] => 2016-07-28 [6] => 2016-07-27 [7] => 2016-07-26 [8] => 2016-07-25 ) Array ( [0] => 2016-07-25 [1] => 2016-07-26 [2] => 2016-07-27 [3] => 2016-07-28 [4] => 2016-07-29 [5] => 2016-07-30 [6] => 2016-07-31 [7] => 2016-08-01 [8] => 2016-08-02 )


Para completar la respuesta de Mostafa, esta es sin duda la forma más simple y eficiente de hacerlo:

function getDatesFromRange($start_date, $end_date, $date_format = ''Y-m-d'') { $dates_array = array(); for ($x = strtotime($start_date); $x <= strtotime($end_date); $x += 86400) { array_push($dates_array, date($date_format, $x)); } return $dates_array; } // see the dates in the array print_r( getDatesFromRange(''2017-02-09'', ''2017-02-19'') );

Incluso puede cambiar el formato de fecha de salida predeterminado si agrega un tercer parámetro cuando llama a la función, de lo contrario, usará el formato predeterminado que se ha establecido como ''Ym-d''.

Espero que ayude :)


Simple pero como un encanto:

$period = new DatePeriod(new DateTime(''2015-01-01''), new DateInterval(''P1D''), new DateTime(''2015-01-15 +1 day'')); foreach ($period as $date) { $dates[] = $date->format("Y-m-d"); } //ONLY SHOWING echo ''<pre>''; var_dump($dates); echo ''</pre>''; exit();


Solución para PHP 5.2 con objetos DateTime. Pero startDate DEBE ser antes de endDate.

function createRange($startDate, $endDate) { $tmpDate = new DateTime($startDate); $tmpEndDate = new DateTime($endDate); $outArray = array(); do { $outArray[] = $tmpDate->format(''Y-m-d''); } while ($tmpDate->modify(''+1 day'') <= $tmpEndDate); return $outArray; }

Utilizando:

$dates = createRange(''2010-10-01'', ''2010-10-05'');

$ fechas contienen:

Array( ''2010-10-01'', ''2010-10-02'', ''2010-10-03'', ''2010-10-04'', ''2010-10-05'' )


También puedes echar un vistazo a la clase DatePeriod :

$period = new DatePeriod( new DateTime(''2010-10-01''), new DateInterval(''P1D''), new DateTime(''2010-10-05'') );

Que debería obtener una matriz con objetos DateTime.

Para iterar

foreach ($period as $key => $value) { //$value->format(''Y-m-d'') }


mira this

function GetDays($sStartDate, $sEndDate){ // Firstly, format the provided dates. // This function works best with YYYY-MM-DD // but other date formats will work thanks // to strtotime(). $sStartDate = gmdate("Y-m-d", strtotime($sStartDate)); $sEndDate = gmdate("Y-m-d", strtotime($sEndDate)); // Start the variable off with the start date $aDays[] = $sStartDate; // Set a ''temp'' variable, sCurrentDate, with // the start date - before beginning the loop $sCurrentDate = $sStartDate; // While the current date is less than the end date while($sCurrentDate < $sEndDate){ // Add a day to the current date $sCurrentDate = gmdate("Y-m-d", strtotime("+1 day", strtotime($sCurrentDate))); // Add this new day to the aDays array $aDays[] = $sCurrentDate; } // Once the loop has finished, return the // array of days. return $aDays; }

usar como

GetDays(''2007-01-01'', ''2007-01-31'');


muchas formas de hacer esto, pero finalmente todo depende de la versión de PHP que esté usando. Aquí hay un resumen de todas las soluciones:

obtener la versión de PHP:

echo phpinfo();

PHP 5.3+

$period = new DatePeriod( new DateTime(''2010-10-01''), new DateInterval(''P1D''), new DateTime(''2010-10-05'') );

PHP 4+

/** * creating between two date * @param string since * @param string until * @param string step * @param string date format * @return array * @author Ali OYGUR <[email protected]> */ function dateRange($first, $last, $step = ''+1 day'', $format = ''d/m/Y'' ) { $dates = array(); $current = strtotime($first); $last = strtotime($last); while( $current <= $last ) { $dates[] = date($format, $current); $current = strtotime($step, $current); } return $dates; }

PHP <4

deberías actualizar :)


Tenga en cuenta que la respuesta proporcionada por ViNce NO incluye la fecha de finalización del período.

Si usa PHP 5.3+, su mejor opción es usar una función como esta:

/** * Generate an array of string dates between 2 dates * * @param string $start Start date * @param string $end End date * @param string $format Output format (Default: Y-m-d) * * @return array */ function getDatesFromRange($start, $end, $format = ''Y-m-d'') { $array = array(); $interval = new DateInterval(''P1D''); $realEnd = new DateTime($end); $realEnd->add($interval); $period = new DatePeriod(new DateTime($start), $interval, $realEnd); foreach($period as $date) { $array[] = $date->format($format); } return $array; }

Entonces, llamarías a la función como se esperaba:

getDatesFromRange(''2010-10-01'', ''2010-10-05'');

Ejecutar demo

Nota sobre la clase DatePeriod : puede usar el 4º parámetro de DatePeriod para excluir la fecha de inicio ( DatePeriod::EXCLUDE_START_DATE ) pero no puede, en este momento, incluir la fecha de finalización.


$arr = range(strtotime("2013-12-01"),strtotime("2013-12-31"), "86400"); array_walk_recursive($arr, function(&$element) { $element = date("Y-m-d", $element); }); print_r ($arr);


$report_starting_date=date(''2014-09-16''); $report_ending_date=date(''2014-09-26''); $report_starting_date1=date(''Y-m-d'',strtotime($report_starting_date.''-1 day'')); while (strtotime($report_starting_date1)<strtotime($report_ending_date)) { $report_starting_date1=date(''Y-m-d'',strtotime($report_starting_date1.''+1 day'')); $dates[]=$report_starting_date1; } print_r($dates); // dates (''2014-09-16'', ''2014-09-26'') //print result Array ( [0] => 2014-09-16 [1] => 2014-09-17 [2] => 2014-09-18 [3] => 2014-09-19 [4] => 2014-09-20 [5] => 2014-09-21 [6] => 2014-09-22 [7] => 2014-09-23 [8] => 2014-09-24 [9] => 2014-09-25 [10] => 2014-09-26 )


<? print_r(getDatesFromRange( ''2010-10-01'', ''2010-10-05'' )); function getDatesFromRange($startDate, $endDate) { $return = array($startDate); $start = $startDate; $i=1; if (strtotime($startDate) < strtotime($endDate)) { while (strtotime($start) < strtotime($endDate)) { $start = date(''Y-m-d'', strtotime($startDate.''+''.$i.'' days'')); $return[] = $start; $i++; } } return $return; }


// will return dates array function returnBetweenDates( $startDate, $endDate ){ $startStamp = strtotime( $startDate ); $endStamp = strtotime( $endDate ); if( $endStamp > $startStamp ){ while( $endStamp >= $startStamp ){ $dateArr[] = date( ''Y-m-d'', $startStamp ); $startStamp = strtotime( '' +1 day '', $startStamp ); } return $dateArr; }else{ return $startDate; } } returnBetweenDates( ''2014-09-16'', ''2014-09-26'' ); // print_r( returnBetweenDates( ''2014-09-16'', ''2014-09-26'' ) );

devolverá la matriz como a continuación:

Array ( [0] => 2014-09-16 [1] => 2014-09-17 [2] => 2014-09-18 [3] => 2014-09-19 [4] => 2014-09-20 [5] => 2014-09-21 [6] => 2014-09-22 [7] => 2014-09-23 [8] => 2014-09-24 [9] => 2014-09-25 [10] => 2014-09-26 )


function createDateRangeArray($start, $end) { // Modified by JJ Geewax $range = array(); if (is_string($start) === true) $start = strtotime($start); if (is_string($end) === true ) $end = strtotime($end); if ($start > $end) return createDateRangeArray($end, $start); do { $range[] = date(''Y-m-d'', $start); $start = strtotime("+ 1 day", $start); } while($start < $end); return $range; }

Fuente: http://boonedocks.net/mike/archives/137-Creating-a-Date-Range-Array-with-PHP.html


function createDateRangeArray($strDateFrom,$strDateTo) { // takes two dates formatted as YYYY-MM-DD and creates an // inclusive array of the dates between the from and to dates. // could test validity of dates here but I''m already doing // that in the main script $aryRange=array(); $iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2), substr($strDateFrom,8,2),substr($strDateFrom,0,4)); $iDateTo=mktime(1,0,0,substr($strDateTo,5,2), substr($strDateTo,8,2),substr($strDateTo,0,4)); if ($iDateTo>=$iDateFrom) { array_push($aryRange,date(''Y-m-d'',$iDateFrom)); // first entry while ($iDateFrom<$iDateTo) { $iDateFrom+=86400; // add 24 hours array_push($aryRange,date(''Y-m-d'',$iDateFrom)); } } return $aryRange; }

fuente: http://boonedocks.net/mike/archives/137-Creating-a-Date-Range-Array-with-PHP.html


function datesbetween ($date1,$date2) { $dates= array(); for ($i = $date1 ; $i<= $date1 ; $i=date_add($i, date_interval_create_from_date_string(''1 days'')) ) { $dates[] = clone $i; } return $dates; }


function getWeekdayDatesFrom($format, $start_date_epoch, $end_date_epoch, $range) { $dates_arr = array(); if( ! $range) { $range = round(abs($start_date_epoch-$end_date_epoch)/86400) + 1; } else { $range = $range + 1; //end date inclusive } $current_date_epoch = $start_date_epoch; for($i = 1; $i <= $range; $i+1) { $d = date(''N'', $current_date_epoch); if($d <= 5) { // not sat or sun $dates_arr[] = "''".date($format, $current_date_epoch)."''"; } $next_day_epoch = strtotime(''+''.$i.''day'', $start_date_epoch); $i++; $current_date_epoch = $next_day_epoch; } return $dates_arr; }


public static function countDays($date1,$date2) { $date1 = strtotime($date1); // or your date as well $date2 = strtotime($date2); $datediff = $date1 - $date2; return floor($datediff/(60*60*24)); } public static function dateRange($date1,$date2) { $count = static::countDays($date1,$date2) + 1; $dates = array(); for($i=0;$i<$count;$i++) { $dates[] = date("Y-m-d",strtotime($date2.''+''.$i.'' days'')); } return $dates; }