В PHP есть простой способ получить первую и последнюю дату месяца?

Мне нужно получить первый и последний день месяца в формате гггг-ММ-ДД дали только месяц и год. Есть хороший, простой способ сделать это?

11 ответов


$first = date('Y-m-d', mktime(0, 0, 0, $month, 1, $year));
$last = date('Y-m-t', mktime(0, 0, 0, $month, 1, $year));

посмотреть date () в документации PHP.


первый день всегда гггг-мм-01, не так ли? Пример: date("Y-M-d", mktime(0, 0, 0, 8, 1, 2008))

последний день накануне первого дня следующего месяца:

$date = new DateTime("2008-09-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");

в первый день месяца всегда равен 1. Так оно и станет

YYYY-MM-01

последний день можно рассчитать как:

<?php
    $num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
    echo "There was $num days in August 2003";
?>

хорошо, сначала очень легко.

date ('Y-m-d', mktime(0,0,0,MM,01,YYYY));

последние немного сложнее, но не намного.

date ('Y-m-d', mktime(0,0,0,MM + 1,-1,YYYY));

Если я правильно помню свою дату PHP...

* * edit-Gah! Его били около миллиона раз...

Edit by Pat:

последний день должен был

date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1

<?php
echo "Month Start - " . $monthStart = date("Y-m-1") . "<br/>";
$num = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y"));
echo "Monthe End - " . $monthEnd = date("Y-m-".$num);
?>

кстати @ZombieSheep решение

date ('Y-m-d', mktime(0,0,0,$MM + 1,-1,$YYYY));

не работает, он должен быть!--3-->

date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1

конечно, принятое решение @ Michał Słaby является самым простым.


просто чтобы убедиться, что я не пропустил свободные концы:

$startDay = 1;

if (date("m") == 1) {
    $startMonth = 12;
    $startYear = date("Y") - 1;

    $endMonth = 12;
    $endYear = date("Y") - 1;
}
else {
    $startMonth = date("m") - 1;
    $startYear = date("Y");

    $endMonth = date("m") - 1;
    $endYear = date("Y");
}

$endDay = date("d") - 1;

$startDate = date('Y-m-d', mktime(0, 0, 0, $startMonth , $startDay, $startYear));
$endDate = date('Y-m-d', mktime(0, 0, 0, $endMonth, $endDay, $endYear));

самый простой способ сделать это с PHP

$dateBegin = strtotime("first day of last month");  
$dateEnd = strtotime("last day of last month");

echo date("MYDATEFORMAT", $dateBegin);  
echo "<br>";        
echo date("MYDATEFORMAT", $dateEnd);

или на прошлой неделе

if (date('N', time()) == 7) {
$dateBegin = strtotime("-2 weeks Monday");
$dateEnd = strtotime("last Sunday");
} else {
$dateBegin = strtotime("Monday last week"); 
$dateEnd = strtotime("Sunday last week");   
}

или последний год

$dateBegin = strtotime("1/1 last year");
$dateEnd = strtotime("12/31 this year");

попробуйте это, чтобы получить количество дней в месяце:

$numdays = date('t', mktime(0, 0, 0, $m, 1, $Y));

пример; я хочу получить первый и последний день текущего месяца.

$month   = (int) date('F');
$year    = (int) date('Y');

date('Y-m-d', mktime(0, 0, 0, $month + 1, 1, $year)); //first
date('Y-m-d', mktime(0, 0, 0, $month + 2, 0, $year)); //last

при запуске этого, например, на дату 2015-01-09, первое и последнее значения будут последовательно;

2015-01-01
2015-01-31

проверено.


С здесь (получить следующий месяц в последний день) это помечено как Дублированное, поэтому я не могу добавить комментарий там, но люди могут получить плохие ответы оттуда.

правильным для последнего дня следующего месяца:

echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-t'));

правильным для первого дня следующего месяца:

echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-01'));

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

echo ((new DateTime())->modify('+1 month')->format('Y-m-t'));