Как я могу найти первый день следующего месяца и оставшиеся дни до сегодняшнего дня с сегодняшнего дня?
спасибо
Получите текущий месяц и год:
$curMonth = date('n'); $curYear = date('Y');
Создайте временную метку для 00:00 в первый день следующего месяца:
if ($curMonth == 12) $firstDayNextMonth = mktime(0, 0, 0, 0, 0, $curYear+1); else $firstDayNextMonth = mktime(0, 0, 0, $curMonth+1, 1);
Число дней до этой даты – это количество секунд между ними, а затем делится на (24 * 60 * 60).
$daysTilNextMonth = ($firstDayNextMonth - mktime()) / (24 * 3600);
Edit: Там вы идете, подстроенный, чтобы учитывать декабрь. Этот метод безопасен в реальном времени.
$firstDayNextMonth = date('Ym-d', strtotime('first day of next month'));
Для получения первого дня после двух месяцев с текущего
$firstDayAfterTwoMonths = date('Ym-d', strtotime('first day of +2 month'));
Самый простой и быстрый способ – использовать strtotime (), который распознает «первый день следующего месяца»;
$firstDayNextMonth = date('Ym-d', strtotime('first day next month'));
Вы можете использовать объект DateTime, подобный этому, чтобы узнать первый день следующего месяца следующим образом:
$date = new DateTime('first day of next month');
Вы можете это сделать, чтобы узнать, сколько дней осталось до первого дня следующего месяца:
$date = new DateTime('now'); $nowTimestamp = $date->getTimestamp(); $date->modify('first day of next month'); $firstDayOfNextMonthTimestamp = $date->getTimestamp(); echo ($firstDayOfNextMonthTimestamp - $nowTimestamp) / 86400;
Поскольку я googled это и пришел к этому ответу, я подумал, что я бы включил более современный ответ, который работает для PHP 5.3.0+.
//Your starting date as DateTime $currentDate = new DateTime(date('Ym-d')); //Add 1 month $currentDate->add(new DateInterval('P1M')); //Get the first day of the next month as string $firstDayOfNextMonth = $currentDate->format('Ym-1');
Вы можете получить первое из следующего месяца:
$now = getdate(); $nextmonth = ($now['mon'] + 1) % 13 + 1; $year = $now['year']; if($nextmonth == 1) $year++; $thefirst = gmmktime(0, 0, 0, $nextmonth, $year);
В этом примере $thefirst
будет отметкой времени UNIX для первого из следующего месяца. Используйте date
чтобы отформатировать ее по своему вкусу.
Это даст вам оставшиеся дни в месяце:
$now = getdate(); $months = array( 31, 28 + ($now['year'] % 4 == 0 ? 1 : 0), // Support for leap years! 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); $days = $months[$now['mon'] - 1]; $daysleft = $days - $now['mday'];
Количество оставшихся дней будет сохранено в $daysleft
.
Надеюсь это поможет!
$firstDayNextMonth = date('Ym-d', mktime(0, 0, 0, date('m')+1, 1, date('Y')));
Как отметил еще один плакат, объект DateInterval не дает точных результатов в течение следующего месяца, когда вы используете даты, такие как 1/31/2016 или 8/31/2016, когда он пропускает следующий месяц. Мое решение состояло в том, чтобы по-прежнему использовать объект DateInterval, но переформатировать текущую дату в первый день текущего месяца до использования DateInterval.
$currentDate = '8/31/2016'; $date = new DateTime(date("n", strtotime($currentDate))."/1/".date("Y", strtotime($currentDate))); //add 1 month $date->add(new DateInterval('P1M')); $currentDate=$date->format('m/1/Y'); echo($currentDate);
-$currentDate = '8/31/2016'; $date = new DateTime(date("n", strtotime($currentDate))."/1/".date("Y", strtotime($currentDate))); //add 1 month $date->add(new DateInterval('P1M')); $currentDate=$date->format('m/1/Y'); echo($currentDate);
Я взял подход матбаста, потому что он смог получить «первый день следующего месяца» с заданной датой, но есть небольшая проблема при расчете $ nextmonth. Исправление:
$now = getdate(); $nextmonth = ($now['mon'] + 1) % 13 + 1; $year = $now['year']; if($nextmonth == 1) $year++; else $nextmonth--; $thefirst = gmmktime(0, 0, 0, $nextmonth, $year);
Сначала я думал об использовании объекта DateInterval (как обсуждалось выше в другом ответе), но он не является надежным . Например, если текущий DateTime – 31 января, а затем мы добавим месяц (чтобы получить следующий месяц), тогда он полностью пропустит февраль!
Вот мое решение:
function start_of_next_month(DateTime $datetime) { $year = (int) $datetime->format('Y'); $month = (int) $datetime->format('n'); $month += 1; if ($month === 13) { $month = 1; $year += 1; } return new DateTime($year . '-' . $month . '-01'); }
Самый простой способ получить последний день месяца
date('Ym-d', mktime(0, 0, 0, date('m')+1, 1, date('Y')));
Еще более простой способ получить первый и последний день следующего месяца
$first = strttotime("first day of next month"); $last = strttotime("last day of next month");
Вы могли бы сделать что-то подобное. Чтобы иметь эту функциональность, вам нужно использовать библиотеку php, доступную в https://packagist.org/packages/ishworkh/navigable-date .
С этим действительно легко сделать то, что вы просите здесь. Например:
$format = 'Ymd H:i:s'; $Date = \NavigableDate\NavigableDateFacade::create('2017-02-24'); var_dump($Date->format($format)); $resetTime = true; $resetDays = true; $NextMonth = $Date->nextMonth($resetTime, $resetDays); var_dump($NextMonth->format($format)); $DayUntilFirstOfNextMonth = $NextMonth->getDifference($Date); var_dump('Days left:' . $DayUntilFirstOfNextMonth->format('%d'));
-$format = 'Ymd H:i:s'; $Date = \NavigableDate\NavigableDateFacade::create('2017-02-24'); var_dump($Date->format($format)); $resetTime = true; $resetDays = true; $NextMonth = $Date->nextMonth($resetTime, $resetDays); var_dump($NextMonth->format($format)); $DayUntilFirstOfNextMonth = $NextMonth->getDifference($Date); var_dump('Days left:' . $DayUntilFirstOfNextMonth->format('%d'));
дает вам выход:
string(19) "2017-02-24 00:00:00" string(19) "2017-03-01 00:00:00" string(11) "Days left:5"
Примечание. Кроме того, эта библиотека позволяет вам перемещаться по датам дням, неделям, годам или взад-вперед. Для получения дополнительной информации ознакомьтесь с ее README.
Вы можете использовать метод date php, чтобы найти текущий месяц и дату, а затем вам нужно будет иметь короткий список, чтобы узнать, сколько дней в этом месяце и вычесть (високосный год потребует дополнительной работы).