numero - obtener primer y ultimo dia de la semana php




Obtener el primer día de la semana en PHP? (20)

Dada una fecha MM-dd-yyyy formato, ¿alguien puede ayudarme a obtener el primer día de la semana?


¿Qué tal esto?

$day_of_week = date('N', strtotime($string_date));
$week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
$week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

¿Qué tal esto?

$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));

El siguiente código debería funcionar con cualquier fecha personalizada, solo usa el formato de fecha deseado.

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;

Probé el código con PHP 5.2.17 Resultados:

Start: 30-07-2012
End: 05-08-2012

Encontré esta solución útil. Solo resta si no es lunes el lunes anterior. Estoy usando $ lower_date como la fecha que extraje de una consulta que necesito reconciliar con el lunes anterior.

//set this up to go backwards until you find monday
while(date('D',strtotime($lower_date))!='Mon'){
    $lower_date = date('Y-m-d', strtotime($lower_date . ' - 1 day')); //increase the upper spec
}

Esta es la solución más corta y más fácil de leer que encontré:

    <?php
    $weekstart = strtotime('monday this week');
    $weekstop = strtotime('sunday this week 23:59:59');
    //echo date('d.m.Y H:i:s', $weekstart) .' - '. date('d.m.Y H:i:s', $weekstop);
    ?>

strtotime es más rápido que el new DateTime()->getTimestamp() .


Esta pregunta necesita una buena respuesta DateTime : -

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));

Salida:-

string '06-10-2013' (length=10)

Esto tratará los límites de los años y los años bisiestos.


Esto es lo que estoy usando para obtener el primer y el último día de la semana desde cualquier fecha . En este caso, el lunes es el primer día de la semana ...

$date = date('Y-m-d') // you can put any date you want
$nbDay = date('N', strtotime($date));
$monday = new DateTime($date);
$sunday = new DateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');

He venido en contra de esta pregunta algunas veces y siempre me ha sorprendido que las funciones de fecha no lo hagan más fácil o más claro. Aquí está mi solución para PHP5 que usa la clase DateTime :

/**
 * @param DateTime $date A given date
 * @param int $firstDay 0-6, Sun-Sat respectively
 * @return DateTime
 */
function getFirstDayOfWeek(DateTime $date, $firstDay = 0) {
    $offset = 7 - $firstDay;
    $ret = clone $date;
    $ret->modify(-(($date->format('w') + $offset) % 7) . 'days');
    return $ret;
}

Es necesario clonar para evitar alterar la fecha original.


La versión siguiente de PHP versión 5.3 siguiente función le da un primer día de la semana de una fecha determinada (en este caso, domingo, 2013-02-03):

<?php
  function startOfWeek($aDate){
    $d=strtotime($aDate);
    return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
  }

  echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>

Mantenlo simple :

<?php    
$dateTime = new \DateTime('2012-05-14');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>

Fuente: manual de PHP


Otra forma de hacerlo ...

$year = '2014';
$month = '02';
$day = '26';

$date = DateTime::createFromFormat('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . '00:00:00');
$day = date('w', $date->getTimestamp());

// 0=Sunday 6=Saturday
if($day!=0){

   $newdate = $date->getTimestamp() - $day * 86400;  //86400 seconds in a day

   // Look for DST change 
   if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){
       if($old == 0){
           $newdate -= 3600;  //3600 seconds in an hour
       } else {
           $newdate += 3600;
       }
   }

   $date->setTimestamp($newdate);
}

echo $date->format('D Y-m-d H:i:s');

Por lo que vale, aquí hay un desglose del comportamiento inseguro del strtotime al determinar un marco de referencia consistente:

http://gamereplays.org/reference/strtotime.php

Básicamente, solo estas cadenas le darán la misma fecha de manera confiable, independientemente del día de la semana en que se encuentre actualmente cuando las llame:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 

Qué pasa:

$date = "2013-03-18"; 
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>';

No es la mejor manera, pero he probado y si estoy en esta semana recibo el lunes correcto, y si estoy en lunes recibiré ese lunes.


Si quiere el lunes como el comienzo de su semana, haga esto:

$date = '2015-10-12';
$day = date('N', strtotime($date));
$week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date)));
$week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));

Suponiendo que el lunes es el primer día de la semana, esto funciona:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));

Una forma inteligente de hacerlo es dejar que PHP maneje las diferencias de zona horaria y el horario de verano (DST). Déjame mostrarte cómo hacer esto.

Esta función generará todos los días de lunes a viernes, inclusive (útil para generar días laborables semanales):

class DateTimeUtilities {
    public static function getPeriodFromMondayUntilFriday($offset = 'now') {
        $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC'));
        $today = $now->setTime(0, 0, 1);

        $daysFromMonday = $today->format('N') - 1;

        $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday)));
        $saturday = $monday->add(new \DateInterval('P5D'));

        return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday);
    }
}

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) {
    print $day->format('c');
    print PHP_EOL;
}

Esto devolverá las fechas de lunes a viernes para la semana actual. Para hacer lo mismo para una fecha arbitraria, pase una fecha como parámetro a DateTimeUtilities ::getPeriodFromMondayUntilFriday , así:

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) {
    print $day->format('c');
    print PHP_EOL;
}

//prints 
//2017-01-02T00:00:01+00:00
//2017-01-03T00:00:01+00:00
//2017-01-04T00:00:01+00:00
//2017-01-05T00:00:01+00:00
//2017-01-06T00:00:01+00:00

¿Solo interesado en el lunes, como preguntó el OP?

$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00


$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

Esto le da el día de la semana de la fecha especificada donde 0 = domingo y 6 = sábado. A partir de ahí, puede calcular hacia atrás al día que desee.


$today_day = date('D'); //Or add your own date
$start_of_week = date('Ymd');
$end_of_week = date('Ymd');

if($today_day != "Mon")
    $start_of_week = date('Ymd', strtotime("last monday"));

if($today_day != "Sun")
                    $end_of_week = date('Ymd', strtotime("next sunday"));

<?php
/* PHP 5.3.0 */

date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date

//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0, 0, 0, date('m', $start_date), date('d', $start_date), date('Y', $start_date)) - ((date("w", $start_date) ==0) ? 0 : (86400 * date("w", $start_date)));

//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);

?>

(Nota: MM, dd y aaaa en la Pregunta no son sintaxis estándar de formato de fecha php; no puedo estar seguro de lo que significa, así que configuro $ start_date con ISO año-mes-día)





datetime