Je dois utiliser PHP DateTime pour obtenir le premier jour de l'année en cours. J'ai essayé:
$year = new DateTime('first day of this year');
var_dump($year);
Mais cela semble revenir le premier jour du mois en cours: 2014-09-01 09:28:56
Pourquoi? Comment puis-je obtenir correctement le premier jour de l'année en cours?
Votre format de date relatif 'first day of this year'
est correct en renvoyant le premier jour du mois en raison de la définition de first day of
:
Définit le jour du premier jour du mois en cours. Cette phrase est la meilleure. utilisé avec un nom de mois après. ( Voir PHP-doc )
Pour obtenir le premier jour de l'année en cours avec le format relatif, vous pouvez utiliser quelque chose comme ceci:
'first day of January ' . date('Y')
echo date('l',strtotime(date('Y-01-01')));
Si vous voulez avoir le premier jour de l'année en cours, utilisez simplement ce code
echo date("l", strtotime('first day of January '.date('Y') ));
Vous pouvez obtenir la date du jour, puis régler le jour et le mois sur 1:
$year = new DateTime();
$year->setDate($year->format('Y'), 1, 1);
Vous pouvez éventuellement définir l’heure à minuit:
$year->setTime(0, 0, 0);
Essaye ça:
date('Y-m-d', strtotime('first day of january this year'));
Regardez ce lien - http://davidhancock.co/2013/11/get-the-firstlast-day-of-a-week-month-quarter-or-year-in-php/
function firstDayOf($period, DateTime $date = null)
{
$period = strtolower($period);
$validPeriods = array('year', 'quarter', 'month', 'week');
if ( ! in_array($period, $validPeriods))
throw new InvalidArgumentException('Period must be one of: ' . implode(', ', $validPeriods));
$newDate = ($date === null) ? new DateTime() : clone $date;
switch ($period) {
case 'year':
$newDate->modify('first day of january ' . $newDate->format('Y'));
break;
case 'quarter':
$month = $newDate->format('n') ;
if ($month < 4) {
$newDate->modify('first day of january ' . $newDate->format('Y'));
} elseif ($month > 3 && $month < 7) {
$newDate->modify('first day of april ' . $newDate->format('Y'));
} elseif ($month > 6 && $month < 10) {
$newDate->modify('first day of july ' . $newDate->format('Y'));
} elseif ($month > 9) {
$newDate->modify('first day of october ' . $newDate->format('Y'));
}
break;
case 'month':
$newDate->modify('first day of this month');
break;
case 'week':
$newDate->modify(($newDate->format('w') === '0') ? 'monday last week' : 'monday this week');
break;
}
return $newDate;
}
dans PHP 5.3.10 cela fonctionne
$myDate = new \DateTime(date("Y")."-01-01");
echo $myDate->format("Y-m-d");
Dans PHP 5.4 et supérieur, vous pouvez tout mettre ensemble
echo (new \DateTime(date("Y")."-01-01"))->format("Y-m-d")
Je voulais juste enregistrer une nuance avec la réponse par
lorem monkey
La méthode suggérée peut entraîner des problèmes lors de l'utilisation de fuseaux horaires.
scénario: considérez que l'heure système actuelle est 2018-01-01 00:20:00 UTC
et que le fuseau horaire par défaut du système est défini sur UTC.
date('Y')
vous donnera 2018
si vous faites quelque chose comme:
$startDate = new DateTime('first day of january '.date('Y'), new DateTimeZone('America/New_York'));
Ceci calculera à 'first day of january 2018'
mais vous aviez réellement besoin de la première date de votre année en cours en Amérique/New_York, qui est toujours 2017.
Arrête de laisser tomber l'homme du ballon, ce n'est pas encore la nouvelle année!
Donc, il vaut mieux faire
$startDate = new DateTime('first day of january', new DateTimeZone('America/New_York'));
Et effectuez ensuite les modifications nécessaires en utilisant la fonction DateTime::modify()
.
Les formats de date relatifs sont amusants.
Mon scénario: je voulais obtenir les limites de cette année comme dans
2018-01-01 00:00:00
à2018-12-31 23:59:59
Ceci peut être réalisé de deux manières avec des formats de date relatifs.
une solution consiste à utiliser la fonction DateTime::modify()
sur l'objet.
$startDate = (new DateTime('now', new DateTimeZone("America/New_York")));
$endDate = (new DateTime('now', new DateTimeZone("America/New_York")));
$startDate->modify("january")
->modify("first day of this month")
->modify("midnight");
$endDate->modify("next year")
->modify("january")
->modify("first day of this month")
->modify("midnight")->modify("-1 second");
var_dump([$startDate, $endDate]);
Essayez ici: https://www.tehplayground.com/Qk3SkcrCDkNJoLK2
Une autre façon de faire est de séparer les chaînes relatives avec une virgule comme ceci:
$startDate = (new DateTime('first day of january', new DateTimeZone("America/New_York")));
$endDate = (new DateTime('next year, first day of january, -1 second', new DateTimeZone("America/New_York")));
var_dump([$startDate, $endDate]);
Essayez ici: https://www.tehplayground.com/hyCqXLRBlhJbCyks
Pour votre heure locale, vous pouvez également effectuer les opérations suivantes:
new DateTime(date("Y")."-01-01" , new DateTimeZone("America/New_York"))
Essaye ça:
$dt = date('m/d/Y',time());
echo 'First day : '. date("01/01/Y", strtotime($dt)).' - Last day : '. date("m/t/Y", strtotime($dt));