Obtenez le premier jour de la semaine en PHP?

124

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

Iggy Ma
la source
4
Qu'entendez-vous par premier jour de la semaine? Voulez-vous dire Sun, Mon? Ou voulez-vous dire la date du premier jour de la semaine?
Jeffrey Hines
2
Le premier jour de la semaine est constant: c'est lundi (ou éventuellement dimanche). Voulez-vous dire que vous voulez obtenir la date du lundi précédant une date arbitraire donnée?
Jon Cram
Quelle version de PHP - 4 ou 5?
Jon Cram
la date du dimanche de la semaine. php 5
Iggy Ma
Etrange, il demande une DateTimesolution et la plupart des réponses ne la fournissent pas. =)
lin

Réponses:

143

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

$ day 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.

JadedCore
la source
1
mais cela signifie le début et la fin de «cette semaine», non?
Oki Erie Rinaldi
et si le numéro de semaine est donné? et je veux qu'il renvoie la date de début et de fin de cette semaine.
Oki Erie Rinaldi
1
@OkiErieRinaldi Vous devriez probablement ouvrir une nouvelle question afin de recevoir l'attention appropriée.
JadedCore
Ne vous inquiétez pas, je l'ai @JadedCore!
Oki Erie Rinaldi
Je ne sais pas pourquoi l'autre est plus élevé. Cela ne fonctionne pas, mais celui-ci fonctionne! 3v4l.org/q6kKY
Jason
67
strtotime('this week', time());

Remplacez time (). Les méthodes du dimanche suivant / dernier lundi ne fonctionneront pas lorsque le jour actuel est dimanche / lundi.

Laurentb
la source
55
$monday = strtotime('last monday', strtotime('tomorrow'));
Lewis Buckley
this weekne fonctionne pas si vous devez toujours avoir un début de semaine précédent, mais le commentaire de @ LewisBuckley le fait.
Smar
Le deuxième argument time()est optionnel si vous souhaitez le spécifier aujourd'hui.
Ifnot
ne fonctionnait pas pour moi, je devais utiliser une syntaxe légèrement différente pour YTD, MTD, WTD.
Ron
6
Cette réponse produit des résultats incohérents, selon la version PHP utilisée: La solution de 3v4l.org/Z3k4E @ LewisBuckley est cohérente pour toutes les versions: 3v4l.org/Eeh9c
Chris Baker
62

strtotimeFonction très simple à utiliser :

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

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

Cela diffère un peu selon les versions de 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

Comparaison aux Edge-Cases

Les descriptions relatives comme cette semaine ont leur propre contexte. Ce qui suit montre la sortie pour cette semaine lundi et dimanche quand c'est un lundi ou un 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";

Cependant, cela diffère un peu selon les versions de 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
Raja Rama Mohan Thavalam
la source
pourquoi cela ne fonctionne-t-il pas pour la date 2016-06-05, ses dates des prochaines semaines
1
Merci pour cela, je viens de modifier ce code pour pouvoir passer un paramètre de date optionnel $ dt = $ custom_date? strtotime ($ date_personnalisée): heure (); $ lundi = date ("Ymd", strtotime ('lundi cette semaine', $ dt)); $ dimanche = date ("Ymd", strtotime ('dimanche cette semaine', $ dt));
Ron Michael
47

Rester simple :

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

Source: manuel PHP

NB: comme certains utilisateurs l'ont commenté, la valeur de $ dateTime sera modifiée.

job3dot5
la source
edit: faute de frappe ou une syntaxe inconnue? d'où vient le \? $dateTime = new \DateTime('2012-05-14');
Sliq
2
Je fais cela pour éviter tout conflit avec un éventuel objet autochargé de votre application. C'est comme un chemin absolu ou un chemin relatif.
job3dot5
9
@Panique - la "syntaxe inconnue" est la syntaxe d'espace de noms de PHP 5.3. L'espacement de noms vous permet de préfixer une classe avec un espace de noms suivi d'une barre oblique inverse. Ici, il l'utilise sans espace de noms afin de spécifier la DateTimeclasse principale , ce qui signifie que le code fonctionnera même si vous avez une autre classe appelée DateTimedans l'espace de noms actuel.
Spudley
Le nom du jour est-il toujours en anglais?
Marwelln
1
La partie clonée ne fonctionne pas correctement. Vous devez d'abord cloner puis effectuer l'opération sur le clonage si vous en avez besoin d'un original.
Farid Movsumov
25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

Cela vous donne le jour de la semaine de la date donnée elle-même où 0= dimanche et 6= samedi. De là, vous pouvez simplement calculer à rebours le jour que vous souhaitez.

Yuvalik
la source
6
Cette réponse renvoie si une date donnée est le dimanche ou le lundi, etc. Mais, l'interlocuteur a demandé la date du dimanche de la semaine de la date donnée comme mentionné dans son commentaire sur la question initiale.
Rakib
19

Cette question nécessite une bonne réponse 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'));

Production:-

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

Cela traitera des limites des années et des années bissextiles.

vascowhite
la source
18

EDIT: le lien ci-dessous ne fonctionne plus sur la version de PHP indiquée. Il fonctionne sur PHP 5.6, ce qui améliore la fiabilité de strtotime, mais n'est pas parfait! Les résultats dans le tableau sont des résultats en direct de PHP 5.6.

Pour ce que ça vaut, voici une ventilation du comportement bancal de strtotime lors de la détermination d'un cadre de référence cohérent:

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

En gros, seules ces chaînes vous donneront de manière fiable la même date, quel que soit le jour de la semaine où vous vous trouvez lorsque vous les appelez:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 
AgmLauncher
la source
L'article a également donné un code spécifique à utiliser: $ start_of_week = strtotime ("lundi prochain - 1 semaine"); // Renvoie le lundi de la semaine en cours à partir de 00:00:00 "$ end_of_week = strtotime (" prochain lundi - 1 seconde "); // Renvoie le dimanche de la semaine en cours se terminant à 23:59:59"
Scott M. Stolz
11

Le code suivant doit 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
Malagana
la source
1
Il convient de noter que cela retournera toujours le lundi précédent, donc si $ custom_date est un lundi, il renverra la date du lundi une semaine plus tôt.
Hill79
2
Ne fonctionne pas correctement, aujourd'hui est dimanche, les résultats sont: Début: 09-09-2013 Fin: 22-09-2013
user2019515
10

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

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
shasi kanth
la source
1
"MM-jj-aaaa" n'est pas la même chose que "Ymd", veuillez adapter votre réponse aux spécificités de la question.
Yevgeniy Afanasyev
1
date ("MM-jj-aaaa") renvoie la date sous la forme: NovNov-0202-15151515. J'espère que cela devrait être: date ("Mdy") qui affiche une date lisible comme: 02-nov-15
shasi kanth
"MM-jj-aaaa" vient de la question. Si vous n'êtes pas sûr de ce que cela signifie, posez-le dans un commentaire sur la question. Merci d'avoir modifié votre réponse.
Yevgeniy Afanasyev
9

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()));
Birkof
la source
8
Le dernier lundi du lundi vous donnera le lundi précédent.
Ikke
8

C'est ce que j'utilise pour obtenir le premier et le dernier jour de la semaine à 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');
ThEBiShOp
la source
1
C'est la vraie réponse!
Manuel
1
Fonctionne comme un charme!
Liga
6

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;  

Production :

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

Irshad Sheikh
la source
5

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"));
Tarquinius Superbus
la source
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)));

(à partir de ce fil de discussion )

James Skidmore
la source
comment obtenir le numéro de la semaine et l'année dans tout ça? J'ai une date de chaîne au format MM-jj-aaaa
Iggy Ma
4

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

strtotimeest plus rapide que new DateTime()->getTimestamp().

plongeur
la source
C'est parfait, voir mon correctif pour les dates australiennes / britanniques
zanderwar
4

Juste utiliser date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));

Kondziutek
la source
2

Étant donné la version PHP antérieure à 5.3, la fonction suivante vous donne un premier jour de la semaine à une date donnée (dans ce cas - dimanche, 03/02/2013):

<?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")).'
');
?>
David Jashi
la source
2
$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"));
user195257
la source
2
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

Vous devez d'abord obtenir le lundi suivant, puis obtenir 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.

Venin Fedy
la source
2

Si vous voulez que le 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)));
Henry Weber
la source
Qu'est-ce qui rend cela préférable à cette réponse ou à cette réponse ? Il me semble qu'il y a plus qu'assez d'options dans les 30 autres réponses ...
Mogsdad
THX. c'est une solution simple et cela fonctionne comme un charme.
Oleg Popov
2

Une façon intelligente de le faire est 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 (pratique 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 renverra les heures du lundi au vendredi pour la semaine en cours. Pour faire de même pour une date arbitraire, passez une date en 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

Uniquement intéressé par lundi, comme le PO l'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
Nino Škopac
la source
1

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

date('N', strptime('%m-%d-%g', $dateString));
soulmerge
la source
1
<?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 une syntaxe de format de date php standard - je ne peux pas être sûr de ce que cela signifie, j'ai donc défini $ start_date avec ISO année-mois-jour)

Micahwittman
la source
1

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

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

strtotime("next Monday") - 604800;

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

Ce code est récupéré lundi prochain et diminue pendant 1 semaine. Ce code fonctionnera bien n'importe quel jour de la semaine. Même si aujourd'hui c'est lundi.

Anton Popov
la source
1

J'ai trouvé cela assez frustrant étant donné que mon fuseau horaire est australien et que strtotime() déteste les dates britanniques.

Si le jour en cours est un dimanche, il strtotime("monday this week")reviendra le lendemain.

Pour surmonter cela:

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"));
Zanderwar
la source
2
Cela fonctionne aussi pour les dates américaines. J'ai testé cela avec le fuseau horaire de Newyork.
Jayesh D
Tant que le dimanche n'est pas votre premier jour de la semaine (lundi en Australie / Royaume-Uni), tout ira bien.
zanderwar
1

Voici un one-liner pour le premier jour de la semaine dernière et le dernier jour de la semaine dernière en tant DateTimequ'objet.

$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);
David Baucum
la source
1
$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"));
Syed Urooj Waqar
la source
Utile lorsque nous avons le lundi comme premier jour de la semaine (du lundi au dimanche).
Kamran Mushtaq
0

Je me suis heurté à cette question à plusieurs reprises 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 DateTimeclasse:

/**
 * @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 de cloner pour éviter de modifier la date d'origine.

contrebis
la source
0

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 le meilleur moyen, 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.

CaféJunky
la source