web-dev-qa-db-fra.com

Comment obtenir le premier jour de l'année en cours?

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?

32
mtmacdonald

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')
27
lorem monkey
echo date('l',strtotime(date('Y-01-01')));
25
Santa's helper

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') ));
10
Rimon Khan

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);
9
Aleks G

Essaye ça:

date('Y-m-d', strtotime('first day of january this year'));
7
Daan

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;
}
2
ARIJIT

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

2

Pour votre heure locale, vous pouvez également effectuer les opérations suivantes:

new DateTime(date("Y")."-01-01" , new DateTimeZone("America/New_York"))
0
applecrusher

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)); 
0
Nikhil Gyan