web-dev-qa-db-fra.com

Obtenez le premier jour de la semaine en PHP?

Étant donné le format de date MM-dd-yyyy, quelqu'un peut-il m'aider à obtenir le premier jour de la semaine?

115
Iggy Ma

Voici ce que j'utilise ...

$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));

$ jour contient un nombre de 0 à 6 représentant le jour de la semaine (dimanche = 0, lundi = 1, etc.).
$ week_start contient la date du dimanche de la semaine en cours sous la forme mm-jj-aaaa.
$ week_end contient la date du samedi de la semaine en cours sous la forme mm-jj-aaaa.

124
JadedCore
strtotime('this week', time());

Remplacez le temps (). Les méthodes dimanche prochain/lundi dernier ne fonctionneront pas si le jour en cours est dimanche/lundi.

59
laurentb

Très simple à utiliser strtotime function :

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", strtotime('sunday this week')), "\n";

Il diffère un peu selon les versions PHP :

Sortie pour 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22

Sortie pour 4.3.5 - 5.2.17

2015-03-23
2015-03-22

Sortie pour 4.3.0 - 4.3.4

2015-03-30
2015-03-29

Comparer chez Edge-Cases

Les descriptions relatives comme cette semaine ont leur propre contexte. Ce qui suit montre la sortie pour cette semaine lundi et dimanche, lundi ou dimanche:

$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

Againt cela diffère un peu selon les versions PHP :

Sortie pour 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22
2015-03-23
2015-03-29

Sortie pour 4.3.5 - 5.0.5, 5.2.0 - 5.2.17

2015-03-16
2015-03-22
2015-03-23
2015-03-22

Sortie pour 5.1.0 - 5.1.6

2015-03-23
2015-03-22
2015-03-23
2015-03-29

Sortie pour 4.3.0 - 4.3.4

2015-03-23
2015-03-29
2015-03-30
2015-03-29
52

Rester 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');    
?>

Source: PHP manuel

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

Cela vous donne le jour de la semaine de la date donnée où 0 = dimanche et 6 = samedi. À partir de là, vous pouvez simplement calculer en arrière jusqu'au jour de votre choix.

25
Yuvalik

Cette question nécessite un bon DateTime réponse: -

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'));

Sortie:-

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

Cela traitera des limites d'année et des années bissextiles.

17
vascowhite

Pour ce qui en vaut la peine, voici une analyse détaillée du comportement inattendu de strtotime lors de la détermination d’un cadre de référence cohérent:

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

Fondamentalement, seules ces chaînes vous donneront la même date, quel que soit le jour de la semaine où vous les appelez:

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

Le code suivant devrait fonctionner avec n'importe quelle date personnalisée, utilise simplement le format de date souhaité. 

$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;

J'ai testé le code avec PHP 5.2.17 Résultats:

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

En supposant que lundi soit le premier jour de la semaine, cela fonctionne:

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

Que dis-tu de ça? 

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

Ici, je considère le dimanche comme le premier et le samedi comme le dernier jour de la semaine. 

$m = strtotime('06-08-2012');  
$today =   date('l', $m);  
$custom_date = strtotime( date('d-m-Y', $m) );   
if ($today == 'Sunday') {  
   $week_start = date("d-m-Y", $m);  
} else {  
  $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));  
}  

if ($today == 'Saturday') {  
  $week_end = date("d-m-Y", $m);
} else {  
  $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));  
}
echo '<br>Start: '. $week_start;  
echo '<br>End: '. $week_end;  

Sortie:

Début: 05-08-2012
Fin: 11-08-2012 

6
Irshad Sheikh

C'est ce que j'utilise pour obtenir le premier et le dernier jour de la semaine à partir de n'importe quelle date . Dans ce cas, le lundi est le premier jour de la semaine ...

$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');
5
ThEBiShOp

Il suffit d'utiliser date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));

4
Kondziutek

Que dis-tu de ça?

$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"));
4

Essaye ça:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
    return date($format, $mon_ts);
}

$sStartDate = week_start_date($week_number, $year);
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));

(de ce sujet de forum )

3
James Skidmore

C'est la solution la plus courte et la plus lisible que j'ai trouvée:

    <?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 est plus rapide que new DateTime()->getTimestamp().

3
dipser

Étant donné PHP la fonction suivante de la version antérieure à la version 5.3 vous donne le premier jour de la semaine de la date donnée (dans ce cas - dimanche, 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")).'
');
?>
2
David Jashi

Si vous voulez que lundi soit le début de votre semaine, procédez comme suit:

$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)));
2
Henry Weber

Pour ce faire, il est judicieux de laisser PHP gérer les différences de fuseau horaire et l'heure d'été (DST). Laissez-moi vous montrer comment faire cela.

Cette fonction générera tous les jours du lundi au vendredi inclus (utile pour générer des jours de semaine de travail):

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

Cela retournera les dates du lundi au vendredi pour la semaine en cours. Pour faire la même chose pour une date arbitraire, transmettez une date en tant que paramètre à DateTimeUtilities ::getPeriodFromMondayUntilFriday, ainsi:

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

Seulement intéressé lundi, comme l'OP a demandé?

$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00
2
Nino Škopac
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

Vous devez commencer lundi prochain, puis le dernier lundi du lundi prochain. Donc, si la date donnée est lundi, elle retournera la même date, pas la semaine dernière, lundi.

2
Fedy Venom
$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"));
2
user195257

Vous analysez la date en utilisant strptime() et utilisez date() sur le résultat:

date('N', strptime('%m-%d-%g', $dateString));
1
soulmerge
<?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);

?>

(Remarque: MM, jj et aaaa dans la question ne sont pas la syntaxe standard du format de date php - je ne sais pas ce que cela signifie, je règle donc $ start_date avec ISO année-mois-jour)

1
micahwittman

Le moyen le plus simple d’obtenir le premier jour (lundi) de la semaine en cours est le suivant: 

strtotime("next Monday") - 604800;

où 604800 - est le nombre de secondes dans une semaine (60 * 60 * 24 * 7).

Ce code sera lundi prochain et le diminuera pendant 1 semaine. Ce code fonctionnera bien tous les jours de la semaine. Même si aujourd'hui est lundi.

1
Anton Popov
$string_date = '2019-07-31';
echo $day_of_week = date('N', strtotime($string_date));
echo $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
echo $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));
1
Syed Urooj Waqar

J'ai trouvé cela assez frustrant étant donné que mon fuseau horaire est Australien et que strtotime() déteste les dates en Grande-Bretagne.

Si le jour actuel est un dimanche, alors strtotime("monday this week") reviendra le lendemain.

Pour surmonter ceci:

Attention : Ceci n'est valable que pour les dates australiennes/britanniques

$startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00"));
$endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59"));
1
zanderwar

Voici une ligne pour le premier jour de la semaine dernière et le dernier jour de la semaine dernière sous forme d'objet DateTime.

$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
                             ->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
                            ->setTime(23, 59, 59);
1
David Baucum

Une autre façon de le faire ....

$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');
1
Michael Pawlowsky

Je l'utilise:

$firstDate = date( 'Y-m-d', strtotime( 'Last Monday', strtotime('-1 week') ));
$lastDate = date( 'Y-m-d', strtotime( 'First Sunday', strtotime('-1 week') ));

J'espère que cela vous aidera!

0

J'ai trouvé cette solution utile. Soustrayez simplement si ce n'est pas lundi pour obtenir le lundi précédent. J'utilise $ lower_date comme date à laquelle j'ai extrait une requête que je dois ensuite réconcilier avec le lundi précédent.

//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
}
0
sweaty

Vous pouvez également utiliser la bibliothèque Carbon

$dateString = '02-21-2015'; // example in format MM-dd-yyyy
$date = Carbon::createFromFormat('m-d-Y', $dateString);
$date->hour(0)->minute(0)->second(0)->startOfWeek();
$dateString = $date->Format('m-d-Y'); // and you have got a string value "02-16-2015"
0

celui-ci est préparé pour aujourd'hui est lundi

function lastMonday(\DateTime $date) {

    $timestamp = $date->getTimestamp();

    $monday = ( 1 == date( 'N', $timestamp ));

    if ($monday) {
        return $timestamp;
    } else {
        return strtotime( 'last monday', $timestamp );
    }
}

si vous voulez qu'il soit horodaté au lieu de DateTime, changez les deux premières lignes (éliminez date-> getTimestamp) changez-les simplement

function lastMonday($timestamp) {

et si vous voulez entrer chaîne changer les deux premières lignes de cette

function lastMonday($dateString) {

    $timestamp = strtotime($dateString);
0
Prozi

Je suis venu à plusieurs reprises contre cette question et j'ai toujours été surpris que les fonctions de date ne rendent pas cela plus facile ou plus clair. Voici ma solution pour PHP5 qui utilise la classe 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;
}

Nécessaire à cloner pour ne pas altérer la date d'origine.

0
contrebis

Je cherchais une solution semblable à celle-ci et j'ai finalement trouvé quelque chose qui reviendra chaque jour de la semaine en cours.

//set current timestamp
$today = time();
//calculate the number of days since Monday
$dow = date('w', $today);
  $offset = $dow - 1;
if ($offset < 0) {
  $offset = 6;
  }
//calculate timestamp for Monday and Sunday
$monday = $today - ($offset * 86400);
$tuesday = $monday + (1 * 86400);
$wednesday = $monday + (2 * 86400);
$thursday = $monday + (3 * 86400);
$friday = $monday + (4 * 86400);
$saturday = $monday + (5 * 86400);
$sunday = $monday + (6 * 86400);
//print dates for Monday and Sunday in the current week
print date("Y-m-d", $monday) . "\n";
print date("Y-m-d", $tuesday) . "\n";
print date("Y-m-d", $wednesday) . "\n";
print date("Y-m-d", $thursday) . "\n";
print date("Y-m-d", $friday) . "\n";
print date("Y-m-d", $saturday) . "\n";
print date("Y-m-d", $sunday) . "\n";

Merci à dbunic qui a posté ceci ici: http://www.redips.net/php/week-list-current-date/#comments

0
NotJay

Devrait marcher:

/**
 * Returns start of most recent Sunday.
 * 
 * @param null|int $timestamp
 * @return int
 */
public static function StartOfWeek($timestamp = null) {
    if($timestamp === null) $timestamp = time();
    $dow = idate('w', $timestamp); // Sunday = 0, Monday = 1, etc.
    return mktime(0, 0, 0, idate('m', $timestamp), idate('d', $timestamp) - $dow, idate('Y', $timestamp));
}

L'entrée et la sortie sont des horodatages Unix. Utilisez date pour formater.

0
mpen

Qu'en est-il de:

$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>';

Ce n'est pas la meilleure façon, mais j'ai testé et si je suis dans cette semaine, j'obtiens le bon lundi, et si je suis un lundi, j'aurai ce lundi.

0
CoffeJunky