Étant donné le format de date MM-dd-yyyy
, quelqu'un peut-il m'aider à obtenir le premier jour de la semaine?
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.
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.
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 :
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, 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 :
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('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
$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.
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.
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");
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
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())));
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()));
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
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');
Il suffit d'utiliser date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
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)));
(de ce sujet de forum )
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()
.
É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")).'
');
?>
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)));
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
$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.
$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"));
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 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)
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.
$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"));
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"));
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);
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');
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!
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
}
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"
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);
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.
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
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.
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.