PHP - ошибка уменьшения даты ()? - PullRequest
1 голос
/ 15 сентября 2009

Я использую метку времени Unix в качестве основы моей начальной даты для использования в запросе с датой ранжирования. Дата начала не является проблемой, для целей данного примера я буду использовать следующую метку времени: 1228089600 (01 декабря 2008 г. 00:00:00).

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

date('o-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("o",1228089600)));

Этот метод работал нормально для меня каждый второй месяц, кроме декабря. Используя начальную дату, добавляя целый месяц (01 января 2009 г. 00:00:00), затем убирая 1 секунду, я ожидал, что результат дата, которую я потребовал (31 декабря 2008 г., 23:59:59). Однако представляется, что год рассчитывается правильно для дополнительного месяца, но не для вычитающей секунды, поскольку возвращаемая дата - 31 декабря 2009 г. 23: 59: 59.

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

Любая помощь очень ценится.

Ответы [ 4 ]

2 голосов
/ 15 сентября 2009

Это происходит потому, что:

флаг 'o' - номер года по ISO-8601. Это имеет то же значение, что и Y, за исключением того, что если Номер недели ISO (W) принадлежит предыдущий или следующий год, этот год используется вместо (добавлено в PHP 5.1.0)

Итак, в вашем случае происходит это:

  1. Дата создания 1 января 2009
  2. Дата уменьшается на 1 секунду (таким образом, вы получите 31 декабря 2008 г.)
  3. Но, как следует из приведенного выше описания, неделя относится к 2009 году, поэтому вместо 2008 года возвращается 2009

(относится к году: означает, что в 2009 году больше дней недели, чем в 2008 году, - в указанном выше случае: 3 дня в 2008 году (понедельник, вторник, среда - 29, 30, 31) и 4 в 2009 году чт, пт, сб, вс - 1, 2, 3, 4))

1 голос
/ 15 сентября 2009

Я добавил несколько исключений, чтобы уменьшить год, если месяц был январь, однако у меня также был другой диапазон дат, построенный на той же стадии, который используется с GA api. Я был удивлен, увидев этот диапазон дат в порядке, несмотря на то, что метод был похож. Разница в том, что ..

Проблематично:

date('o-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("o",1228089600)));

Штраф:

date('Y-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("Y",1228089600)));

Таким образом, переключение, похоже, решило проблему.

Надеюсь, когда-нибудь все это кому-нибудь пригодится.

1 голос
/ 15 сентября 2009

Это действительно похоже на ошибку с тем, как mktime() обрабатывает значение "месяцев" больше 12.

php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 2, 1, 2008));
2008-01-31 23:59:59
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 3, 1, 2008));
2008-02-28 23:59:59
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 1, 1, 2008));
2007-12-31 23:59:59

php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 13, 1, 2008));
2009-12-31 23:59:59
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 13, 1, 2007));
2008-12-31 23:59:59

Ваша лучшая ставка прямо сейчас, вероятно, состоит в том, чтобы просто проверить вывод date('m', ...)+1 самостоятельно и в особом случае вычисление, если результат равен 13.

0 голосов
/ 15 сентября 2009

Попробуйте это:

$start = 1228089600;
$number_of_days_in_month = date('t', $time);
$end = strtotime('+' . $number_of_days_in_month . ' days', $start) - 1;
// subtract one second to get 23:59:59 or don't to get 00:00:00.
// Also note that there can be a leap second.
// $end = $start + $number_of_days_in_month * 86400 - 1; would probably work as well.

echo date('o-m-d G:i:s', $end);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...