Подтвердить что ты не робот

Как получить первый день текущего года?

Мне нужно использовать PHP DateTime для получения первого дня текущего года. Я пробовал:

$year = new DateTime('first day of this year');
var_dump($year);

Но это, кажется, возвращает первый день текущего месяца: 2014-09-01 09:28:56

Почему? Как правильно получить первый день текущего года?

4b9b3361

Ответ 1

Ваш относительный формат даты 'first day of this year' верен, возвращая первый день месяца из-за определения first day of:

Устанавливает день первого из текущего месяца. Эта фраза лучше используется вместе с именем месяца, следующим за ним. (См. PHP-doc)

Чтобы получить первый день текущего года с относительным форматом, вы можете использовать что-то вроде этого:

'first day of January ' . date('Y')

Ответ 2

echo date('l',strtotime(date('Y-01-01')));

Ответ 3

Вы можете получить текущую дату, а затем установить день и месяц на 1:

$year = new DateTime();
$year->setDate($year->format('Y'), 1, 1);

При желании вы можете установить время до полуночи:

$year->setTime(0, 0, 0);

Ответ 4

Или используйте только текст в функции strtotime:

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

Ответ 5

Если вы хотите получить первый день текущего года, просто используйте этот код

echo date("l", strtotime('first day of January '.date('Y') ));

Ответ 6

Просто хотел записать какой-то нюанс с ответом lorem monkey

Предлагаемый метод может вызвать проблемы при использовании часовых поясов.

Сценарий: рассмотрим текущее системное время 2018-01-01 00:20:00 UTC и системный часовой пояс по умолчанию установлен на UTC.

date('Y') даст вам 2018

если вы делаете что-то вроде:

$startDate = new DateTime('first day of january '.date('Y'), new DateTimeZone('America/New_York'));

Это будет вычислено как 'first day of january 2018' но вам действительно нужна была первая дата вашего текущего года в Америке/Нью-Йорке, которая по-прежнему 2017 года.

Хватит бросать мяч человеку, его еще не новый год!

Так что лучше просто сделать

$startDate = new DateTime('first day of january', new DateTimeZone('America/New_York'));

Затем DateTime::modify() необходимые изменения, используя функцию DateTime::modify().

Относительные форматы даты - это весело.

Мой сценарий: я хотел получить границы этого года, как в 2018-01-01 00:00:00 до 2018-12-31 23:59:59

Это может быть достигнуто двумя способами с относительными форматами даты.

Одним из способов является использование функции DateTime::modify() для объекта.

$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]);

Попробуйте здесь: https://www.tehplayground.com/Qk3SkcrCDkNJoLK2

Другой способ сделать это - разделить относительные строки запятой следующим образом:

$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]);

Попробуйте здесь: https://www.tehplayground.com/hyCqXLRBlhJbCyks

Ответ 7

Взгляните на эту ссылку - 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;
}

Ответ 8

в PHP 5.3.10 это работает

$myDate = new \DateTime(date("Y")."-01-01");                                                                                                                                                                        
echo $myDate->format("Y-m-d");

В PHP 5.4 и выше вы можете собрать все

echo (new \DateTime(date("Y")."-01-01"))->format("Y-m-d")

Ответ 9

В качестве комментатора @Glavić сказал уже

$year = new DateTime('first day of January');

является решением.

Для меня это имело смысл семантически, что "в этом году" должен вернуться полночь первого дня в году, но на самом деле это не так!

Ответ 10

Для вашего локального времени вы также можете сделать следующее:

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

Ответ 11

Попробуй это:

$dt = date('m/d/Y',time());

echo 'First day : '. date("01/01/Y", strtotime($dt)).' - Last day : '. date("m/t/Y", strtotime($dt)); 

Ответ 12

Я просто использую

echo  Date('Y-01-01');

Просто и понятно

Ответ 13

$start_year = DateTime::createFromFormat('Y-m-d', $date->format('Y-01-01'), new DateTimeZone('Europe/London'));

Ответ 14

В основном date ('Y') возвращает значение текущего года. и первый день каждого года начинается как 2000-01-01.

так что это поможет вам получить точный вывод.

$firstdate = date('Y').'01-01';