web-dev-qa-db-fra.com

PHP: la semaine commence le lundi, mais "lundi cette semaine" le dimanche devient lundi la semaine prochaine

Voici un résumé du problème: Le dimanche, strtotime('this week') renvoie le début de la semaine prochaine.

En PHP, la semaine semble commencer le lundi. Mais, n'importe quel jour sauf le dimanche, ce code

echo date('Y-m-d', strtotime('monday this week', strtotime('last sunday')));

Affiche la date du lundi de cette semaine, alors qu'il semble devoir être affiché lundi dernier. Il semble que, dans ce cas, PHP traite dimanche et lundi comme le début de la semaine. Nous sommes maintenant le lundi 10 décembre 2012 ou 2012-12-10. date('Y-m-d', strtotime('sunday last week')) renvoie 2012-12-09 - hier.

Est-ce un bug ou est-ce que je manque quelque chose? Il semble qu'un bug aussi évident devrait être connu, mais je ne trouve rien à ce sujet. Est-ce le seul moyen de faire en sorte que le début de la semaine utilise un traitement spécial le dimanche?

$week_offset = (int) 'sunday' == date('l');
$week_start  = strtotime("-$week_offset monday"); // 1 or 0 Mondays ago
34
tvanc

Autant que je sache, c'est un bug. Je ne vois aucune raison logique pour laquelle strtotime('this week'); devrait renvoyer une date future. C'est un très gros bug. Dans mon cas particulier, j'ai eu un classement qui a montré aux utilisateurs avec le plus de points depuis le début de la semaine. Mais le dimanche, il était vide car strtotime renvoyait un horodatage pour une date ultérieure. J'étais douteux, parce que je ne savais pas comment cela aurait pu passer inaperçu, mais je n'ai pu trouver aucun autre rapport sur ce bogue.

Merci pour tout votre temps et votre aide, mes amis.

10
tvanc

Voici comment vous pouvez obtenir le lundi de la semaine en cours:

echo date("Y-m-d", strtotime(date('o-\\WW')));
6
Vadim Guzev

Cette réponse est en retard, mais c'est quelque chose avec lequel j'ai eu du mal. Chaque solution que j'ai essayée jusqu'à présent a mal fonctionné pour une raison ou une autre. C'est ce que j'ai fini avec qui a fonctionné pour moi. (bien que ça puisse être joli, ça marche au moins).

$thisMonday =  strtotime('next Monday -1 week', strtotime('this sunday'));
6
Bryant

Ce n’est pas idéal mais c’est ce que j’ai eu recours:

if(date('N') == 7) { 
    $date = date('Y-m-d',strtotime('monday last week'));
} else {
    $date = date('Y-m-d',strtotime('monday this week'));
}
3
sebtucknott
  I think the only problem with your coding is TimeZone.

Solution:
Définissez votre propre fuseau horaire. Voici l'exemple de mon propre fuseau horaire:

Exemple

   date_default_timezone_set('Asia/Kolkata');


   Set the above line before calling any time function.

Bonne journée.

1
Nemo

Basé sur Bryant réponse:

$first_week_date = date('d F Y', strtotime('next Monday -1 week', strtotime('this sunday')));
$last_week_date = date('d F Y', strtotime('next Monday -1 week + 6 days', strtotime('this sunday')));
0
Baim Wrong

Ceci est pour ceux qui recherchent une solution amicale qui fonctionne avec n'importe quel jour.

function getWeekStart($week_start_day = "Monday") {
    $week_days = array("Sunday"=>0,"Monday"=>1,"Tuesday"=>2,"Wednesday"=>3,"Thursday"=>4,"Friday"=>5,"Saturday"=>6,);

    if(!isset($week_days[$week_start_day])) {
        return false;
    } else {
        $start_day = $week_days[$week_start_day];

        $today = date("w");
        $one_day = (60 * 60 * 24);

        if($today < $start_day) {
            $days_difference = 7 - ($start_day - $today);
        } else {
            $days_difference = ($today - $start_day);
        }

        $week_starts = strtotime(date("Y-m-d 00:00:00")) - ($one_day * $days_difference);

        return $week_starts;
    }
}

//Test: If today is Monday, it will return today's date
echo date("Y-m-d H:i:s", getWeekStart("Monday"));
0
Overcomer

Je pense au lieu d'essayer 

echo date('Y-m-d', strtotime('monday this week', strtotime('last sunday')));

tu devrais essayer 

echo date('Y-m-d', strtotime('monday last week'));
0
anuj arora

Essayez ce code

// set current date
$date = date("m/d/Y");
$ts = strtotime($date); // also $ts = time();

// find the year and the current week
$year = date('o', $ts);
$week = date('W', $ts);
// print week for the current date
$i = 1; // 1 denotes the first day of week

$ts = strtotime($year.'W'.$week.$i);
echo $day = date("l", $ts); // generate the name of day
echo "<br>";
echo $day = date("Y-m-d", $ts); // generate the date

Vous obtiendrez la date de la semaine en cours. Que vous soyez lundi ou non, vous obtiendrez la date de ce lundi.

0
anuj arora

Si vous voulez le lundi le plus récent:

function mostRecentMonday(){
  if(date("w") == 1){
   return strtotime("midnight today");
  } else {
   return strtotime("last monday");
  }
}

Facile à modifier pour utiliser DateTime, ou même pour spécifier une date différente à utiliser comme base.

0
chasepeeler