Comments 60
Ты не рассказал о том как получить русское название месяца, ну там про локаль и все такое.
Это немного не по теме поста, но ничего сложного тут нет:
setlocale(LC_ALL, "ru_RU.UTF-8");
Такие вещи разработчик обязан знать.
Спасибо, ваше мнение важно для нас!
А зачем вы здесь? Только рассказывать своё?
Так стоп.
Автор написал:
>> Мне нужно было получить название предыдущего месяца.
>> $months = array(1=>'Январь','Февраль','Март'...);
А в альтернативном предложенном варианте, не рассказал про локаль и я просто ему об этом напомнил.
Это не значит, что я не считаю это знание тайным или не всем доступным.
Тут появился комментатор с неуместным на мой взгляд комментарием (в свете описанного выше).
Я немного сыронизировал на эту тему, сорри, признаюсь немного раздражаюсь когда в мой с автором тред кто-то влезает с замечанием не по теме.
Прошу прощения за недопонимание в треде и доставленные неудобства, так же приношу извинения всем, кому моя ирония показалась обидной.
Автор написал:
>> Мне нужно было получить название предыдущего месяца.
>> $months = array(1=>'Январь','Февраль','Март'...);
А в альтернативном предложенном варианте, не рассказал про локаль и я просто ему об этом напомнил.
Это не значит, что я не считаю это знание тайным или не всем доступным.
Тут появился комментатор с неуместным на мой взгляд комментарием (в свете описанного выше).
Я немного сыронизировал на эту тему, сорри, признаюсь немного раздражаюсь когда в мой с автором тред кто-то влезает с замечанием не по теме.
Прошу прощения за недопонимание в треде и доставленные неудобства, так же приношу извинения всем, кому моя ирония показалась обидной.
Боюсь, вас сейчас заминусуют. Поделиться одной маленькой проблемой и одним решением — это маловато.
Совет: добавьте больше способов решения этой проблемы, например, через класс DateTime. Опишите плюсы и минусы каждого способа.
Совет: добавьте больше способов решения этой проблемы, например, через класс DateTime. Опишите плюсы и минусы каждого способа.
Лично я пользуюсь подобной конструкцией:
date('F', mktime(0, 0, 0, date('n') - 1, 1));
Чтобы «обнулить» время можно так first day of previous month midnight
31.05.2012 +1 month вполне верно выдало 01.07.2012, так как 31.06.2012 не существует.
18 лет назад я получил первый штраф от полцаев — в протоколе стояло 31 июня. Указал им на ошибку, исправили на 30.06. А показав возможность расчётов количества дней в месяца по костяшкам пальцев — штраф был уменьшен в пару раз.
Если подумать, то правильно она работает. Она думает что 31 мая минус 1 месяц возвращает 31 апреля, которого нету и он понимается как 1ое мая.
Кстати например вот ORACLE 31 мая минус 1 месяц вернул 30 апреля.
Кстати например вот ORACLE 31 мая минус 1 месяц вернул 30 апреля.
Я не говорю, что функция работает не правильно. Просто при конструкции "-1 month" я ожидаю, что функция будет вычитать месяцы а не дни.
31.05 вычитаем месяц получаем 31.04 которое равно 1.05 — такая логика в этой функции видимо.
Она вычитает именно месяц, а не дни. Она берет дату, отнимает от текущего месяца (а он 5) 1 и сохраняет ее такой же, а дни _совершенно_ не трогает, как вы и ожидали. и получается 2012-04-31. Или вы не ожидали что пхп нормализует неправильные даты?
Вряд ли. Скорее, у них месяц равен 30 дням.
Нет, человек прав, и месяц равен не 30 дням, иначе февраль бы вообще все вычисления портил. А вы вместо того чтоб подумать немного говорите глупости.
Думаю JS вы понимаете и алгоритм функции прост:
В итоге получается 31 апреля, как и сказал ohifck, но такого числа нет, поэтому эта дата нормализуется в 1 мая.
Думаю JS вы понимаете и алгоритм функции прост:
d = new Date()
d.setMonth( d.getMonth() -1 )
В итоге получается 31 апреля, как и сказал ohifck, но такого числа нет, поэтому эта дата нормализуется в 1 мая.
На похапе тож самое — вот с февралем (29 дней в этом году было)
php > $dt = new DateTime('2012-03-31');
php > $dt->modify('-1 month');
php > var_dump($dt);
object(DateTime)#2 (3) {
["date"]=>
string(19) "2012-03-02 00:00:00"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Moscow"
}
Дык это я человеку обьяснил как работает алгоритм этой функции =) Он просто похоже питоном занимается, и я выбрал JS как возможно общий язык. Так во многих языках, нормализация идет чтоб не вызывать ошибки неправильной даты, опять же этим удобно пользоваться:
$dt = new DateTime("$tear-$month-00");
var_dump($dt->format('Y-m-d'));
и вуаля, у нас всегда будет последнее число предидущего месяца! дальше работаем с этми месяцем.
Просто ошибка то на столько наивная =) Или я с JS переработал, там не так много методов для работы с датой.
$dt = new DateTime("$tear-$month-00");
var_dump($dt->format('Y-m-d'));
и вуаля, у нас всегда будет последнее число предидущего месяца! дальше работаем с этми месяцем.
Просто ошибка то на столько наивная =) Или я с JS переработал, там не так много методов для работы с датой.
А так реально я представляю в скольких местах у меня код сегодня повалится и сколько плавающих багов объясняется этим. Спасибо за статью — раньше не обращал на это внимания.
Вот из-за таких как вы, PHP-шников называют быдлокодерами. И я вас огорчу.
«В такие моменты каждый PHP-программист начинает изобретать следующий велосипед:»
Нет, в такие моменты php-программист начинает искать причину проблемы, а не изобретать велосипед. А судя из последующей фразы:
«Но мне надоели эти костыльные решения»
Вы именно к этой категории и относитесь, которые строят велосипеды даже не разобравшить в проблеме.
Радует что вам это хоть надоело =)
«В такие моменты каждый PHP-программист начинает изобретать следующий велосипед:»
Нет, в такие моменты php-программист начинает искать причину проблемы, а не изобретать велосипед. А судя из последующей фразы:
«Но мне надоели эти костыльные решения»
Вы именно к этой категории и относитесь, которые строят велосипеды даже не разобравшить в проблеме.
Радует что вам это хоть надоело =)
Если бы все проекты оплачивались (ну или хотя бы мотивировались) достаточно, что бы разбираться в таких мелки проблемах, быдлокодеров было бы гораздо меньше.
Если бы да кабы…
Если бы да кабы…
Да, на хабре в рабочее время мы можем сидеть, а вот разобраться в проблеме, это мало денег платят и плохо мотивируют =)
Или вас еще нужно мотивировать чтоб вы опыта набирались? Так и не будут платить пока не наберетесь, а набираться вы не хотите потому что недоплачивают… прям замкнутый круг какой-то.
Или вас еще нужно мотивировать чтоб вы опыта набирались? Так и не будут платить пока не наберетесь, а набираться вы не хотите потому что недоплачивают… прям замкнутый круг какой-то.
Вы утрируете.
ua2.php.net/manual/ru/datetime.formats.relative.php
«Замечание:
Относительные значения в месяцах рассчитываются исходя из их продолжительности. Например из „+2 month 2011-11-30“ получится „2012-01-30“, т.к. ноябрь состоит из 30 дней, а декабрь из 31 дня, что в сумме дает 61 день. Это связано с ноября составляет 30 дней в длину, и в декабре является 31 дней в длине, производя в общей сложности 61 дней.»
Даже по русски вам написали в мануале, и переводить не нужно.
Да, я утрирую, просто имел ввиду что мануалы нужно читать, там больше инфы чем на хабре, особенно учитывая что это ваш хлеб
«Замечание:
Относительные значения в месяцах рассчитываются исходя из их продолжительности. Например из „+2 month 2011-11-30“ получится „2012-01-30“, т.к. ноябрь состоит из 30 дней, а декабрь из 31 дня, что в сумме дает 61 день. Это связано с ноября составляет 30 дней в длину, и в декабре является 31 дней в длине, производя в общей сложности 61 дней.»
Даже по русски вам написали в мануале, и переводить не нужно.
Да, я утрирую, просто имел ввиду что мануалы нужно читать, там больше инфы чем на хабре, особенно учитывая что это ваш хлеб
UFO just landed and posted this here
UFO just landed and posted this here
Демонстрация профессионального копипаста?
UFO just landed and posted this here
Почему же Вы не ведете мастер классы для быдлокодеров?
Мне Вас очень не хватает.
Мне Вас очень не хватает.
UFO just landed and posted this here
Институт закончил Веб программирования =)
Пока Вы будете таким занятым, и не начнете просвещать темноту, 95% php-программистов, так и останутся быдлокодерами с массивами месяцев. Я потратил пол часа своего времени, что бы сообщить людям, которым лень читать мануалы, а более интересно читать о суде над Ассанжем, что есть такая вот возможность. В реальных проектах я очень редко встречаю использование strtotime и уж тем более strftime.
Пока Вы будете таким занятым, и не начнете просвещать темноту, 95% php-программистов, так и останутся быдлокодерами с массивами месяцев. Я потратил пол часа своего времени, что бы сообщить людям, которым лень читать мануалы, а более интересно читать о суде над Ассанжем, что есть такая вот возможность. В реальных проектах я очень редко встречаю использование strtotime и уж тем более strftime.
Человеку нужно было название предидущего месяца
UFO just landed and posted this here
сарказм неуместен, на самом деле минимум 50% пхп-шников о проблеме "+1 месяц" не то что не знают, а не подозревают даже, возможно и вы тоже входите в те 50% незнающих, раз такая реакция пошла.
UFO just landed and posted this here
Немного не понял. Разве задача не стояла «узнать какое число было месяц назад»? Если так — то задача решается именно '-1 month', ведь для непоследнего дня месяца 'last day of month' вернет не тоже самое что минус месяц. Поясните?
twitter.com/rasmus/status/208157669452816384
twitter.com/rasmus/status/208160760302538752
это определённо не ново.
twitter.com/rasmus/status/208160760302538752
это определённо не ново.
$t = strtotime(date('Y-m-01').' -1 month')
Выдаёт такой же резульат, но без хитрых фразочек на английском ;)
Я, может, чего-то не понимаю, но «first day of previous month» это совсем не то же что "-1 month" во всех случаях, кроме первого числа месяца.
Может лучше ссылочку вот эту в конце поста поставить?
ru.php.net/manual/en/datetime.formats.relative.php
или
ru.php.net/manual/ru/datetime.formats.relative.php
ru.php.net/manual/en/datetime.formats.relative.php
или
ru.php.net/manual/ru/datetime.formats.relative.php
Sign up to leave a comment.
Проблема модификации даты через strtotime