Ошибка формата даты в PHP при использовании strtotime () - PullRequest
1 голос
/ 28 марта 2011

Я использую

$jsdate = date("Y, m, d", strtotime('-1 month', (strtotime($date))));

, чтобы конвертировать мои даты из

2011-03-28
to
2011, 02, 28

Проблема в том, что это приводит к непредсказуемым результатам.Например сегодня у меня

2011-03-28
converted to
2011, 02, 28  // OK

 AND

2011-03-29
to
2011, 03, 01 // not OK!

Кто-нибудь знает, что здесь не так?Интересно, является ли вычисление неточным из-за -1 month.

Есть ли способ простого вычитания 1 из m в ...date("Y, m, d", ...?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Мои данные должны быть отформатированы как JavaScript Date Object, где январь равен 0, февраль равен 1 и т. Д. Поэтому нет необходимости специально вычитать 1 месяц , но на самом деле вычитать 1от месяца целое число .В конце, результирующая строка должна быть не на 1 месяц раньше, а фактически той же датой, представленной в стиле JS Date Object.Я считаю, что ответ @ vprimachenko ниже является хорошим решением.Я прошу прощения, если это не было ясно в моем ОП.

Спасибо!

Ответы [ 3 ]

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

вы можете использовать

$datee = explode('-',$date);
if($datee[1]-- < 0) {
    $datee[1]=12;
    $datee[0]--;
}
$jsdate = implode(', ',$datee);
0 голосов
/ 28 марта 2011

Расчет не является неточным, как таковой. Там нет 29.02.2011. Если вы измените свой ввод на 29.03.2012, вы увидите, что он возвращает 29.02.2012, потому что 2012 год високосный. То же самое произойдет с использованием что-то вроде 31.07.2011. В июне только 30 дней, поэтому 31 июля минус один месяц будет 1 июля (потому что 31 июня не существует).

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

Если вам действительно нужен соответствующий день предыдущего месяца, вам, вероятно, нужно сделать оператор if в соответствии с приведенным ниже текстом, чтобы откатить день до последнего дня февраля:

$jsdate = date("Y, m, d", strtotime('-1 month', (strtotime($date))));
if($month == '3') {
   $jsdate = date("Y, m, d", strtotime('-1 day', (strtotime($jsdate))));
}

Вам также придется учитывать остальные дни марта, которых нет в феврале, а также високосные годы и делать что-то подобное в течение 31-дневного месяца, следующего за 30-дневным.

0 голосов
/ 28 марта 2011

strtotime может работать неожиданным образом, но это логично

strtotime('-1 months',strtotime('2011-03-29')  // is 2011-02-29
date('Y-m-d','2011-02-29'); //gets converted to the next real date

Вот одно из исправлений http://www.phpreferencebook.com/tips/fixing-strtotime-1-month/

...