PHP отнимает 1 месяц от даты, отформатированной с датой ('mY')

Я пытаюсь вычесть 1 месяц из даты.

$today = date('m-Y');

Это дает: 08-2016

Как я могу вычесть месяц, чтобы получить 07-2016?

11 ответов

Решение
 <?php 
  echo $newdate = date("m-Y", strtotime("-1 months"));

выход

07-2016

Предупреждение! Приведенные выше примеры не сработают, если позвонить им в конце месяца.

<?php
$now = mktime(0, 0, 0, 10, 31, 2017);
echo date("m-Y", $now)."\n";
echo date("m-Y", strtotime("-1 months", $now))."\n";

будет выводить:

10-2017
10-2017

Следующий пример даст тот же результат:

$date = new DateTime('2017-10-31 00:00:00');
echo $date->format('m-Y')."\n";
$date->modify('-1 month');
echo $date->format('m-Y')."\n";

Множество способов решения проблемы можно найти в другой ветке: PHP DateTime:: modify, добавление и вычитание месяцев

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

$today = date('m-Y');
$newdate = date('m-Y', strtotime('-1 months', strtotime($today))); 
echo $newdate;

В зависимости от вашей версии PHP вы можете использовать объект DateTime (введен в PHP 5.2, если я правильно помню):

<?php
$today = new DateTime(); // This will create a DateTime object with the current date
$today->modify('-1 month');

Вы можете передать другую дату в конструктор, она не должна быть текущей датой. Дополнительная информация: http://php.net/manual/en/datetime.modify.php

$lastMonth = date('Y-m', strtotime('-1 MONTH'));

Я использовал это, чтобы предотвратить ошибку "последние дни месяца". Я просто использую второй strtotime(), чтобы установить дату на первый день месяца:

<?php
echo $newdate = date("m-Y", strtotime("-1 months", strtotime(date("Y-m")."-01")));

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

$effectiveDate = date('2018-01'); <br> 
echo 'Date'.$effectiveDate;<br>
$effectiveDate = date('m-y', strtotime($effectiveDate.'+-1 months'));<br>
echo 'Date'.$effectiveDate;
$currentMonth = date('m', time());
$currentDay = date('d',time());
$currentYear = date('Y',time());
$lastMonth = $currentMonth -1;
$one_month_ago=mkdate(0,0,0,$one_month_ago,$currentDay,$currentYear);

Это можно было бы переписать более элегантно, но у меня это работает

Сначала измените формат даты с YY на YM

    $date = $_POST('date'); // Post month
    or
    $date = date('m-Y'); // currrent month

    $date_txt = date_create_from_format('m-Y', $date);
    $change_format = date_format($date_txt, 'Y-m');

Этот код минус 1 месяц до указанной даты

    $final_date = new DateTime($change_format);
    $final_date->modify('-1 month');
    $output = $final_date->format('m-Y');

Я понимаю, что это старый пост, но я решал ту же проблему, и вот что я придумал, чтобы учесть всю изменчивость. Эта функция просто пытается получить относительные даты, то есть тот же день предыдущего месяца или последний день месяца, если вы находитесь в последний день, независимо от того, сколько именно дней в месяце. Таким образом, задана цель «2010-03-31» и вычесть месяц, мы должны вывести «2010-02-28».

      private function subtractRelativeMonth(DateTime $incomingDate): DateTime
{
    $year = $incomingDate->format('Y');
    $month = $incomingDate->format('m');
    $day = $incomingDate->format('d');
    $daysInOldMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);
    if ($month == 1) { //It's January, so we have to go back to December of prior year
        $month = 12;
        $year--;
    } else {
        $month--;
    }
    $daysInNewMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);
    if ($day > $daysInNewMonth && $month == 2) { //New month is Feb
        $day = $daysInNewMonth;
    }
    if ($day > 29 && $daysInOldMonth > $daysInNewMonth) {
        $day = $daysInNewMonth;
    }
    $adjustedDate = new \DateTime($year . '-' . $month . '-' . $day);
    return $adjustedDate;
}
if(date("d") > 28){
    $date = date("Y-m", strtotime("-".$loop." months -2 Day"));
} else {
    $date = date("Y-m", strtotime("-".$loop." months"));
}
Другие вопросы по тегам