Est-il possible d'obtenir la première/dernière date d'une semaine en utilisant le format PHP Date/Heure relative ?
J'ai essayé de faire:
date_default_timezone_set('Europe/Amsterdam');
$date = new DateTime();
$date->modify('first day of this week'); // to get the current week's first date
echo $date->format('Y-m-d'); // outputs 2011-12-19
$date->modify('first day of week 50'); // to get the first date of any week by weeknumber
echo $date->format('Y-m-d'); // outputs 2011-12-18
$date->modify('last day of this week'); // to get the current week's last date
echo $date->format('Y-m-d'); // outputs 2011-12-17
$date->modify('last day of week 50'); // to get the last date of any week by weeknumber
echo $date->format('Y-m-d'); // outputs 2011-12-18
Comme vous pouvez voir il n’affiche pas les dates correctes.
Selon les docs cela devrait être possible si j'ai raison.
Est-ce que je fais quelque chose de mal
EDIT
J'ai besoin d'utiliser DateTime de PHP pour les dates dans un futur lointain.
UPDATE
Cela devient seulement étranger maintenant. J'ai fait d'autres tests.
Windows PHP 5.3.3
2011-12-01
Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (first day of week 50) at position 13 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 9
2011-12-01
2011-11-30
Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (last day of week 50) at position 12 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 15
2011-11-30
Linux 5.3.8
2011-12-01
2011-12-01
2011-11-30
2011-11-30
Selon les documents, les chaînes de format "premier jour de" et "dernier jour de" ne sont autorisées que pendant des mois et non des semaines. Voir http://www.php.net/manual/en/datetime.formats.relative.php
Si vous combinez le premier et le dernier jour de la semaine avec un relevé hebdomadaire, le résultat est renvoyé à l'analyseur ou correspond à quelque chose d'inattendu (normalement le premier ou le dernier jour du mois, et non une semaine).
La différence que vous voyez entre Win et Linux n’est probablement due qu’à des paramètres de rapport d’erreur différents.
Pour obtenir le premier et le dernier jour de la semaine en cours, utilisez:
$date->modify('this week');
$date->modify('this week +6 days');
Pour obtenir le premier et le dernier jour de la semaine 50, utilisez:
$date->setISODate(2011, 50);
$date->setISODate(2011, 50, 7);
EDIT:
Si vous souhaitez utiliser la méthode de modification pour les nombres de semaine absolus, vous devez utiliser les formats définis dans http://www.php.net/manual/en/datetime.formats.compound.php :
$date->modify('2011W50');
$date->modify('2011W50 +6 days');
Je suis un grand fan de l’utilisation de Carbon , ce qui rend ce genre de choses très facile. Par exemple:
use Carbon\Carbon;
$monday = Carbon::now()->startOfWeek()
$sunday = Carbon::now()->endOfWeek()
Ou, si vous préférez que le dimanche soit le premier jour de votre semaine:
use Carbon\Carbon;
Carbon::setWeekStartsAt(Carbon::SUNDAY);
Carbon::setWeekEndsAt(Carbon::SATURDAY);
$sunday = Carbon::now()->startOfWeek()
$saturday = Carbon::now()->endOfWeek()
si le premier jour de la semaine est lundi
$date->modify('Monday this week');
sinon si le premier jour est dimanche
$date->modify('Sunday this week');
parce que dans différents pays le premier jour de la semaine peut-être le lundi ou le dimanche
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, 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');
<code>
function getlastweek_first_last_date()
{
$cur_date = strtotime(date('Y-m-d')); // Change to whatever date you need
// Get the day of the week: Sunday = 0 to Saturday = 6
$previousweekcurdate = $cur_date - (7*24*3600);
$cur_date = $previousweekcurdate;
$dotw = date('w', $cur_date);
if($dotw>1)
{
$pre_sunday = $cur_date-(($dotw-1)*24*60*60) - (24*60*60);
$next_satday = $cur_date+((7-$dotw)*24*60*60)- (24*60*60);
}
else if($dotw==1)
{
$pre_sunday = $cur_date- (24*60*60);
$next_satday = $cur_date+((7-$dotw)*24*60*60)- (24*60*60);
}
else if($dotw==0)
{
$pre_sunday =$cur_date -(6*24*60*60)- (24*60*60);
$next_satday = $cur_date- (24*60*60);
}
$pre_sunday = date('Y-m-d',$pre_sunday)." 00:00:00";
$next_satday = date('Y-m-d',$next_satday)." 23:59:59";
$date_array = array();
$date_array['sdoflw'] = $pre_sunday;
$date_array['edoflw'] = $next_satday;
return $date_array;
}
$date_array = getlastweek_first_last_date();
echo $start_date_of_week = $date_array['sdoflw'];
echo $end_date_of_week = $date_array['edoflw'];
</code>
function getweek_first_last_date($date)
{
$cur_date = strtotime($date); // Change to whatever date you need
// Get the day of the week: Sunday = 0 to Saturday = 6
$dotw = date('w', $cur_date);
if($dotw>1)
{
$pre_monday = $cur_date-(($dotw-1)*24*60*60);
$next_sunday = $cur_date+((7-$dotw)*24*60*60);
}
else if($dotw==1)
{
$pre_monday = $cur_date;
$next_sunday = $cur_date+((7-$dotw)*24*60*60);
}
else if($dotw==0)
{
$pre_monday =$cur_date -(6*24*60*60);;
$next_sunday = $cur_date;
}
$date_array = array();
$date_array['start_date_of_week'] = $pre_monday;
$date_array['end_date_of_week'] = $next_sunday;
return $date_array;
}
$date = '2013-12-22';
getweek_first_last_date($date);
Output :
$array_of_week = Array
(
[start_date_of_week] => 1387152000
[end_date_of_week] => 1387670400
)
$start_date =date('d/m/Y', $array_of_week['start_date_of_week'])