Étant donné un MM-dd-yyyy
format de date , quelqu'un peut-il m'aider à obtenir le premier jour de la semaine?
DateTime
solution et la plupart des réponses ne la fournissent pas. =)
Étant donné un MM-dd-yyyy
format de date , quelqu'un peut-il m'aider à obtenir le premier jour de la semaine?
DateTime
solution et la plupart des réponses ne la fournissent pas. =)
Réponses:
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.
strtotime('this week', time());
Remplacez time (). Les méthodes du dimanche suivant / dernier lundi ne fonctionneront pas lorsque le jour actuel est dimanche / lundi.
$monday = strtotime('last monday', strtotime('tomorrow'));
this week
ne fonctionne pas si vous devez toujours avoir un début de semaine précédent, mais le commentaire de @ LewisBuckley le fait.
time()
est optionnel si vous souhaitez le spécifier aujourd'hui.
strtotime
Fonction 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 :
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-30
2015-03-29
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 :
2015-03-16
2015-03-22
2015-03-23
2015-03-29
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-29
2015-03-23
2015-03-29
2015-03-30
2015-03-29
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.
$dateTime = new \DateTime('2012-05-14');
DateTime
classe principale , ce qui signifie que le code fonctionnera même si vous avez une autre classe appelée DateTime
dans l'espace de noms actuel.
$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.
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.
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");
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
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())));
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');
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
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"));
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 )
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()
.
Juste utiliser date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
É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")).'
');
?>
$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"));
$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.
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)));
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
Vous analysez la date en utilisant strptime()
et utilisez date()
sur le résultat:
date('N', strptime('%m-%d-%g', $dateString));
<?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)
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');
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.
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"));
Voici un one-liner pour le premier jour de la semaine dernière et le dernier jour de la semaine dernière en tant DateTime
qu'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);
$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"));
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 DateTime
classe:
/**
* @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.
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.