Как получить предыдущий месяц и год относительно сегодняшнего дня, используя strtotime и date? - PullRequest
56 голосов
/ 30 марта 2011

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

Однако см. Следующий пример.

// Today is 2011-03-30
echo date('Y-m-d', strtotime('last month'));

// Output:
2011-03-02

Такое поведение понятно (до определенного момента), из-зана разное количество дней в феврале и марте, и код в приведенном выше примере - это то, что мне нужно, но работает только на 100% правильно в период с 1 по 28 числа каждого месяца.

Итак, как получить последний месяц И год(представьте себе date("Y-m")) самым элегантным из возможных способов, который работает на каждый день года?Оптимальное решение будет основано на разборе аргументов strtotime.

Обновление.Чтобы немного уточнить требования.

У меня есть фрагмент кода, который получает статистику за последние пару месяцев, но я сначала показываю статистику за прошлый месяц, а затем загружаю другие месяцы, когда это необходимо.Это намеченная цель.Итак, в течение ЭТОГО месяца я хочу выяснить, какой месяц-год мне нужно выбрать, чтобы загрузить ПРЕДЫДУЩУЮ статистику за месяц.

У меня также есть код, который учитывает часовой пояс (сейчас это не очень важно),и он принимает strtotime -совместимую строку в качестве входных данных (для инициализации внутренней даты), а затем позволяет настраивать дату / время, также используя strtotime -совместимые строки.

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

echo tz::date('last month')->format('Y-d')

Итак, мне нужны ТОЛЬКО предыдущие месяц и год, в strtotime -совместимая мода.

Ответ (спасибо, @dnagirl):

// Today is 2011-03-30
echo date('Y-m-d', strtotime('first day of last month')); // Output: 2011-02-01

Ответы [ 14 ]

1 голос
/ 30 марта 2011

Возможно, немного длиннее, чем вы хотите, но я использовал больше кода, чем, возможно, необходимо, чтобы он был более читабельным.

Тем не менее, он дает тот же результат, что и вы.получение - что это вы хотите / ожидаете, что оно выйдет?

//Today is whenever I want it to be.
$today = mktime(0,0,0,3,31,2011);

$hour   = date("H",$today);
$minute = date("i",$today);
$second = date("s",$today);
$month  = date("m",$today);
$day    = date("d",$today);
$year   = date("Y",$today);

echo "Today: ".date('Y-m-d', $today)."<br/>";
echo "Recalulated: ".date("Y-m-d",mktime($hour,$minute,$second,$month-1,$day,$year));

Если вы просто хотите, чтобы месяц и год, то просто установите день на «01», а не на «сегодняшний» день:

 $day = 1;

Это должно дать вам то, что вам нужно.Вы можете просто установить часы, минуты и секунды на ноль, а также не заинтересованы в их использовании.

 date("Y-m",mktime(0,0,0,$month-1,1,$year);

Сокращает их совсем немного; -)

0 голосов
/ 01 февраля 2018
function getOnemonthBefore($date){
    $day = intval(date("t", strtotime("$date")));//get the last day of the month
    $month_date = date("y-m-d",strtotime("$date -$day days"));//get the day 1 month before
    return $month_date;
}

Итоговая дата зависит от количества дней, из которых состоит входной месяц.Если месяц ввода - февраль (28 дней), то за 28 дней до 5 февраля - 8 января. Если ввод - 17 мая, 31 дней до 16 апреля. Аналогично, если ввод - 31 мая, итоговая дата будет 30 апреля.

ПРИМЕЧАНИЕ : на входе указана полная дата ('ym-d') и на выходе ('ym-d') вы можете изменить этот код в соответствии со своими потребностями.

0 голосов
/ 07 января 2018
//return timestamp, use to format month, year as per requirement
function getMonthYear($beforeMonth = '') {
    if($beforeMonth !="" && $beforeMonth >= 1) {
        $date = date('Y')."-".date('m')."-15";
        $timestamp_before = strtotime( $date . ' -'.$beforeMonth.' month' );
        return $timestamp_before;
    } else {
        $time= time();
        return $time;
    }
}


//call function
$month_year = date("Y-m",getMonthYear(1));// last month before  current month
$month_year = date("Y-m",getMonthYear(2)); // second last month before current month
0 голосов
/ 11 ноября 2016

Если решение DateTime приемлемо, этот фрагмент возвращает год последнего месяца и месяц прошлого месяца, избегая возможной ловушки при выполнении этого в январе.

function fn_LastMonthYearNumber()
{
 $now = new DateTime();
 $lastMonth = $now->sub(new DateInterval('P1M'));
 $lm= $lastMonth->format('m');
 $ly= $lastMonth->format('Y');
 return array($lm,$ly);
}
...