metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2013-10-13 03:04 pm

Тупой и еще тупее

Скажите мне пожалуйста, существует ли общепринятый метод передачи дат или даты-времени в параметрах URL для сервиса, например?
Сколько не пишу подобное - практически всегда все сводится к "прибиваем гвоздями ISO8601, парсим строку руками и под каждую задачу заново решаем, что делать с невалидными строками - то ли валится с 4хх, то ли валится с 5хх, то ли игнорировать ошибки, использовать или нет TryParse (если он вообще есть, обычно нету - "у нас всегда все работает, а невалидных дат не бывает") и как возвращать сообщения об ошибках клиенту так, чтобы он мог хоть что-то вменяемое сделать.

[identity profile] veremeenko-alex.livejournal.com 2013-10-13 12:16 pm (UTC)(link)
Нету. Все во что кто горазд.

И не дай бог контрол на странице использует локаль пользователя, а парсится с локалью сервера.
Сайт нормально работает только до 12 числа каждого месяца :)

[identity profile] falcrum.livejournal.com 2013-10-13 12:26 pm (UTC)(link)
Потом месяц 13-й появляется? А что до этого херню сохраняет - никого не настораживает?

[identity profile] veremeenko-alex.livejournal.com 2013-10-13 02:35 pm (UTC)(link)
Так для америкосов все ок, а то что этот же сайт плохо работает у других, nobody care.
Понятно что для сайта лечится просто -показываем в локали пользователя, но везде работаем и храним в локали сервера.
Но для рестфул сервиса или сайта с внешним апи пляски обеспечены.

[identity profile] w00dy.livejournal.com 2013-10-13 02:24 pm (UTC)(link)
вот-вот, ебантеи. Вместо этого сранного html5 лучше бы сделали кошерную поддержку глобализации.

[identity profile] sergiej.livejournal.com 2013-10-13 12:19 pm (UTC)(link)
если юзеру нет дела до даты и времени то юниксовый таймстемп просто и удобно. Если есть дело то хоть и не станарт, но удобоно: YYYYMMDDHHMMSS (ну если часовой пояс некритичен) :)
Edited 2013-10-13 12:20 (UTC)

[identity profile] belezbar.livejournal.com 2013-10-13 12:31 pm (UTC)(link)
А если ещё и пояс добавить: 13 = +3, 03 = -3 ?

[identity profile] sergiej.livejournal.com 2013-10-13 12:51 pm (UTC)(link)
можно, но как автор правильно заметил - всё это обходные маневры, а стандарта безопасного нет

[identity profile] dr-cha0s.livejournal.com 2013-10-13 04:35 pm (UTC)(link)
Зачем? Всё в UTC.

[identity profile] gds.livejournal.com 2013-10-13 12:53 pm (UTC)(link)
во, такое я видел, вполне удобно.

А ошибки парсинга -- ну, как и в любых других случаях обрабатывать, чем дата/время тут особенны?

[identity profile] w00dy.livejournal.com 2013-10-13 02:28 pm (UTC)(link)
А если вам нужны даты до 1970 года? В общем в жопу unix timestamp. Лучше тогда как в DateTime - хранить тики в int64, один тик - 100ns. До 10000 года вроде хватает.

[identity profile] sergiej.livejournal.com 2013-10-13 03:19 pm (UTC)(link)
Можно тики. Но как тогда даты до большого взрыва хранить? И непонятно как время из параллельного пространства хранить.

[identity profile] sbj-ss.livejournal.com 2013-10-13 03:41 pm (UTC)(link)
Зря вы так категорично.
Точек отсчёта придумано стопицот, но на моей памяти ни одна не учитывает интересы историков. Когда несколько лет назад у нас на конторе зашла речь об обучающей системе именно по истории, то вообще предлагалась безумная идея собственного формата с распихиванием по битам (чтобы влезть в 4 байта на x86), который в SQL Server хранился просто в int - чтобы обеспечить поиск и сортировку. Это не от хорошей жизни, а от отсутствия альтернатив.
Впрочем, "даты до 1970" касаются не только историков. Даты рождения, например.

[identity profile] sergiej.livejournal.com 2013-10-13 04:35 pm (UTC)(link)
я просто шучу. Всё зависит от поставленной задачи.

[identity profile] lionet.livejournal.com 2013-10-13 10:29 pm (UTC)(link)
Что не так с юниксовым таймстампом для дней рождения? Отрицательные числа — не миф.

[identity profile] sbj-ss.livejournal.com 2013-10-14 08:39 am (UTC)(link)
Да, по стандарту - timestamp со знаком. Спасибо, что поправили.

[identity profile] lionet.livejournal.com 2013-10-13 10:31 pm (UTC)(link)
YYMMDDHHMMSS — это и есть один вариантов ISO8601. Только если добавить в конец символ 'Z' — будет ещё и однозначно в смысле таймзоны: UTC.

[identity profile] sergiej.livejournal.com 2013-10-14 04:25 am (UTC)(link)
ну вот и прелестно. Главное, что оно парсится в лёт стандартными парсерами дат в джаве например.

[identity profile] mehanizator.livejournal.com 2013-10-13 12:31 pm (UTC)(link)
таймстамп GMT+0

[identity profile] metaclass.livejournal.com 2013-10-13 12:41 pm (UTC)(link)
В секундах, микросекундах, начиная от какой даты отсчет? :)
И как представлять величины типа "учетная дата" (у нее времени нет, соотвественно, представление с секундами для нее противоречиво")

[identity profile] thedeemon.livejournal.com 2013-10-13 01:46 pm (UTC)(link)
В 100-наносекундных юнитах от первого явления ангела Джабраила пророку Мухаммеду.

[identity profile] theiced.livejournal.com 2013-10-13 02:20 pm (UTC)(link)
время - когда это время события или чего то ещё - таймстэмп, юниксовый. дату - если это бухгалтерская дата - ymd. если кто то передаёт ydm или ещё какой ад - это его проблемы же.

[identity profile] theiced.livejournal.com 2013-10-13 02:21 pm (UTC)(link)
ну или передай как три поля - если не хочешь что бы ошибки проникали такие, пооохуй.

[identity profile] david-m.livejournal.com 2013-10-14 07:32 am (UTC)(link)
Ну так это (даты) и есть единственная реальная проблема. Потому что в разных поясах одна и та же дата в разное время начинается.

Представление _времени_ (с минутами-секундами) — это не проблема вообще, а вот как народ с датами выкручивается, я бы почитал.

[identity profile] sergiej.livejournal.com 2013-10-13 01:19 pm (UTC)(link)
зачем GMT+0 если таймстемп?

[identity profile] mehanizator.livejournal.com 2013-10-13 01:20 pm (UTC)(link)
да, верно.

[identity profile] lionet.livejournal.com 2013-10-13 10:32 pm (UTC)(link)
ISO8601: YYMMDDHHMMSS.fracZ

[identity profile] berezovsky.livejournal.com 2013-10-13 12:58 pm (UTC)(link)
можно взять DateTime.ParseExact со параметром "O", где дата и время буквой T разделяются
падать по ситуации, ошибки в лог писать, наиболее серьёзные сбои - уведомлением админу, клиента успокаивать, "мы работаем над этим"

[identity profile] berezovsky.livejournal.com 2013-10-13 01:12 pm (UTC)(link)
Вообще, тут желание решить задачу раз и навсегда максимально удобным, красивым и универсальным способом.
Как у Форда, который хотел создать двигатель самым мощным, надёжным и экономичным.
Но у него как-то была глобальная цель сделать автомобиль доступным рядовому гражданину.
А тут выходит, что решение должно подходить под любой будущий абстрактный проект. Не совсем понятно. :-(

[identity profile] sbj-ss.livejournal.com 2013-10-13 01:52 pm (UTC)(link)
Мне нравится формат, используемый в RSS: "Fri, 20 Sep 2013 10:32:00 GMT". Несмотря на избыточность (день недели) и запись месяца строкой, отлично съедается String.TryParse().

[identity profile] vp.livejournal.com 2013-10-13 02:17 pm (UTC)(link)
Съедается в какой локали?

[identity profile] sbj-ss.livejournal.com 2013-10-13 02:19 pm (UTC)(link)
В нейтральной, если я правильно помню.

[identity profile] sergiej.livejournal.com 2013-10-13 03:27 pm (UTC)(link)
В урле с пробелами и двоеточиями? Круто.

[identity profile] sbj-ss.livejournal.com 2013-10-13 03:31 pm (UTC)(link)
Вот на что-что, а на экранирование символов в GET/POST данных есть совершенно однозначный RFC.

[identity profile] sergiej.livejournal.com 2013-10-14 04:30 am (UTC)(link)
создавать проблемы, а потом их героически решать, для дат тоже есть iso но автор попросил что-то "кошерное иначе"

[identity profile] sbj-ss.livejournal.com 2013-10-14 08:43 am (UTC)(link)
..и все сошлись на том, что универсального "кошерного иначе" нет :)
Следовательно, годится любой однозначно интерпретируемый формат, который можно минимальными усилиями преобразовать в машинное представление, один из которых я и предложил - пусть и произвольным образом.
Что до "героически решать" - я бы согласился, если бы пробелов, двоеточий и т.д. не могло бы быть в других параметрах запроса. На текстовые поля предустановленных форматов нет по определению.

[identity profile] chemodax.livejournal.com 2013-10-13 02:21 pm (UTC)(link)
В любом случае 4xx, а не 5xx: 5xx это проблема на сервере (конфигурации или там памяти не хватает), а 4xx это что-то не так с запросом и нет смысла пробовать еще раз без изменение запроса.

[identity profile] sbj-ss.livejournal.com 2013-10-13 03:34 pm (UTC)(link)
Кстати да. 5хх для "вы херню прислали" - оно повсеместно, но идеологически неправильно.
Потом "отказоустойчивый" клиент будет долбать неверными данными сервер до посинения.

[identity profile] bydlorus.livejournal.com 2013-10-13 05:14 pm (UTC)(link)
time.ToString а там пусть разбираются.

[identity profile] berezovsky.livejournal.com 2013-10-13 05:25 pm (UTC)(link)
так автору же разбираться :-)))))

[identity profile] bydlorus.livejournal.com 2013-10-13 05:54 pm (UTC)(link)
Это завтра, а сегодня... пьём гуляем.

[identity profile] sbj-ss.livejournal.com 2013-10-13 05:26 pm (UTC)(link)
Какая славная провокация.

[identity profile] bydl0coder.livejournal.com 2013-10-13 09:47 pm (UTC)(link)
Чо тут думать? ISO 8601 и 400 Bad Request.

[identity profile] no-mad.livejournal.com 2013-10-13 09:50 pm (UTC)(link)
Имхо, миллисекунды рулят.

[identity profile] sdfgh153.livejournal.com 2013-10-14 04:21 am (UTC)(link)
Unixtime же. Самый беспроблемный способ, как мне кажется.

[identity profile] lionet.livejournal.com 2013-10-14 09:11 am (UTC)(link)
ISO8601 же. Заодно и глазами посмотреть можно.

[identity profile] mak-sh.livejournal.com 2013-10-15 09:08 am (UTC)(link)
Передавать дату-время в виде double - модифицированный юлианский день в дробном виде. Можно хранить в любой базе без проблем.
Знакомые баллисты так хранят чтобы не зависеть от формата времени в разных базах.