Как стать автором
Обновить

Комментарии 44

Не сразу понятно, о каком языке программирования идет речь.
уточнил )
разве 12/29/2008 относится не к первой неделе 2009-го года?
относится, но так же и относится к 53 недели года, и правильнее на мой взгляд пока я нахожусь в 2008 показывать мне номер на этот год а не на следующий, потому что когда система строится из соотношения года и номера недели я хочу знать что у меня 53 — 2008 а не 00 — 2008 так как при всем при этом год он показывает 2008 — й.

Цель поста моего заключалась в предостережении при проектировании и тестировании. Я использовал strftime потому что он показал мне данные которые мне были необходимы за что и спасибо.

Надеюсь что новый класс DateTime кажется, будет работать стабильно
Просто есть несколько разных стандартов.
Разве из названия блога это неясно?
Из названия блога ясно.

P.S. Пост был в персональном блоге. Автор уже всё поправил и разместил куда надо.
И картинка гномовского календаря с толку сбивает.
Наверное, речь о date (в тексте и тегах).
спасибо
> для точных и калледарных вычислений data вовсе не подходит
Обоснуйте пожалуйста
Гхм. Да я вообще-то автору поста привёл цитату из него и выделил ошибки курсивом :) Так что за обоснованиями — к автору :)
теперь про «глюкабрь» стало чуть понятнее ;)
Из описания date: W Порядковый номер недели года по ISO-8601
А все описания этого стандарта говорят, что неделя — от 01 до 53. И откуда там ноль взялся?
из практики, хотя надо заметить что до определеного момента проект разрабатывался одновременно фришке и маке date шалил во всю, несмогу обьяснить почему, я всего лишь програмист а не разработчик языка.
Думаю тут дело не в языке, а в ОС/библиотеках, плюс локали. Уж под никсами точно PHP вызывает системные date() и strftime(). А уж как реализовывали под виндой и и др. осями…
про винду речи не было, мак он же фришка, фришка и убунта
Каков бы не был спор думаю надо проверять такие глюки на практике, поэтому в посте и есть слово осторожно
Угу, но начиная с 29-12-2008 номер недели равен 1 :)
нашел откуда у нуля ноги растут (вернее, наверное, тело, ноги где-нить в суровой послевоенной древности :) )
www.opengroup.org/onlinepubs/007908799/xcu/date.html

%W
Week of the year (Monday as the first day of the week) as a decimal number [00-53]. All days in a new year preceding the first Monday are considered to be in week 0.
29.12 не похоже на «All days in a new year preceding the first Monday»
А вот как раз описание к аналогичной мускуловской функции, о котором я откомментил чуть ниже, говорит точнее :)

Note that if a date falls in the last week of the previous year, MySQL returns 0 if you do not use 2, 3, 6, or 7 as the optional mode argument:

Ну а так как ноги растут из одного места…
А тут вопрос что считать новым годом :)

По тому же исошному стандарту 29-12-2008 это первый день первой недели 2009 года :)))))

<?php
echo strftime ('%V %G', strtotime('12/29/2008'));
?>

выводит 01 2009
А я-то думаю, что я в понедельник отмечал )))))))
Почитайте описание функции week() от MySQL. Там разобрана похожая проблема и объясняется, откуда берётся нулевая неделя. Во всём виноваты проклятые буржуи. :) В PHP, видимо, действуют те же алгоритмы.
Насколько помню, алгоритм майскуеля нехрена не совпадает с пхп.
Насчет осторожности — очень даже согласен :)
У нас тут недавно были проблемы с написанным для нас промышленным драйвером. В ночь на 1е декабря он начал сбоить. Два дня мы просидели на работе, пытаясь разобраться с глюками, а 2го числа разработчик прислал обновление. После анализа логов он обнаружил, что неправильно вел работу с месяцами, и декабрь (12 месяц) у него не обрабатывается. Соответственно отсутствие синхронизации и т.д.
В общем, с нетерпением ждем НГ, вдруг 2009й год они тоже не учли…
Да… есть праздничные даты, про которые полезно помнить круглый год… особенно, приступая к разработке очередного проекта! :)
работа с датами — вообще одна из наиболее раздражающих областей
выбирайте:
%U номер недели в году, если первый день недели — воскресенье (00..53)
%V номер недели по ISO, если первый день недели — понедельник (01..52)
%W номер недели в году, если первый день недели — понедельник (00..53)

$ date "+%W %V %U"
52 01 52
отлично, только как это применить в PHP?
ну наверно как обычно date('W') например
В общем то сами RFC не настолько прозрачны и часто содержат вот такие вот подводные камни. Частенько в PHP делали более интуитивными такие вещи, но в последнее время больше делают по RFC, в итоге якобы появляются вот такие баги, хотя на самом деле это жесткое следование RFC. С датами именно с этой проблемой было обсуждение на internal листе и решили оставить так, как написано в RFC и не делать свой фикс, так что запоминайте подводный камень и обходите сами если очень надо.
А если работаем с БД и строим отчеты, то лучше иметь таблицу, где каждой дате будут проставлены соответственно год, квартал, месяц, неделя (можно в нескольких стандартах), день недели и т.д.
Сильно жизнь упрощает и запросы ускоряет, к вашей задаче тоже применимо.
НЛО прилетело и опубликовало эту надпись здесь
А в ПыхПыхе уже появился нормальный класс (а не strtotime(“12/29/2008″)) для работы с датой-временем?
Можно подумать, есть какое-то принципиальное различие между «нормальным классом» и «ненормальными» функциями работы с.
Если вы считаете, что strtotime(“12/29/2008″) — это нормально, то мне вас искренне жаль. Нормально — это как минимум new DateTime(2008, 12, 29), но никак не инициализация из строкового представления.
Вы какого-то не того человека выбрали, чтобы жалеть. Вероятно вы, каким-то чудом, меня не знаете.
в 5.2 появился DateTime плюс еще несколько классов вспомогательных
Это всего лишь OOP врапер над теми же функциями, это обсуждалось в Internal mailing list, да и на паблике наверно тоже.
Какой вопрос, такой и ответ :)
появился, но он отвратительно кривой
вот хорошая подробная статья: laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/
Использую PEAR Calendar
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории