Pull to refresh

Comments 11

Только сохранять надо не время UTC плюс часовой сдвиг, а время по UTC и часовой пояс (то есть Asia/Vladivostok, а не +10:00). Потому что если вы празднуете день рождения в 11 часов ночи, то вы будете праздновать в 11 часов ночи по Владивостоку даже если Владивосток решит, что у него теперь UTC+9.


Точное время рождения вы не ставите и вместо вас его ставит ваше устройство как 00:00

Вот здесь ещё ошибка, потому что сохранять надо было именно дату, без времени вообще, а не пытаться моделировать временной меткой, надеясь, что момент времени не уплывёт на другой день. Часовые пояса простираются от –12 до +14, так что при таком подходе по какому бы поясу вы бы не сохраняли — где-нибудь у вас будет «неправильная» дата рождения по местному времени.

Задача стоит сохранить вплоть до минут время рождения

Тогда вам придётся жить с тем, что всегда найдётся часовой пояс, где время рождения выглядит не «по-человечески». Если вы родились в 23:00 во Владивостоке — на Камчатке это час ночи следущего дня по местным часам.

Вы спутали два понятия:

1) момент рождения (хотя, разве это момент? интервал, скорее) в UTC, который, нужен только, если стоит задача, определить, кто из двух лиц старше,

2) запись в паспорте, которая инвариантна, т.е. при записи во всякие базы данных меняться не должна.

P.S. Вы еще скажите, что человек родившийся 29 февраля високосного года стареет в 4 раза медленнее, чем "обычные" люди.

Нужно сначала решить, для чего нам хранить дату рождения. Основные случи использования, думаю:

1. Для дополнительной аутентификации (по документам, при покупке авиабилетов и т.п.). Тут нужно хранить именно дату, и сравнивать только дату, без учёта часовых поясов.

2. Для определения возраста. Опять же, практически (и юридически) обычно часовые пояса не учитываются, а дата из документов считается по локальному часовому поясу. Да и случаи, при определение возраста разница в несколько часом имеет какое-то значения очень редки. Соответственно также нужно хранить только дату.

3. Поздравления с днем рождения и т.п. Какой-либо юридической значимости, обычно, не имеют, поэтому как хранить — непринципиально. Тем более, что разные люди по разному этот день начинают праздновать: кто-то в 00:00, кто-то знает точное время рождения, кто-то «как проснутся, с утра».

Автор не придал значения тому, как определена дата рождения (дата; время и часовой пояс роли в жизни не играют) и когда она отмечается (одинаковый день со смещением по годам). Не быть UX дизайнером :)

Сколько Новых Годов существует? Если лететь в самолете, можно умудриться отпраздновать дважды. С ДР не мешает ничто проделать то же самое.

Юридически... лезьте в нормы и документы называется. Если у страны несколько часовых поясов, то консервативно применяя локальную часовую зону компании на сервере (пользователь с дальнего востока, а считаем по МСК), думаю ничего не будет, к чему можно будет придраться (даже если пользователь из Европы и мы ему МСК временем на час-два раньше дадим совершеннолетие, например).

Если равняться на пользователя, учитывая его местонахождение или заданный часовой пояс... ну и что? Для оповещений - это и надо делать, а плюс-минус 12 часов - создайте юридический прецедент, если такового нет, с радостью посмотрим.

Короче: хранить дату, в зависимости от задачи применять часовой пояс пользователя или компании.

Если стоит задача поминутной проверки кто раньше родился - Катя или Саша, заморачивайтесь, как выше написали, не только точной датой+временем, но и местоположением (а то вдруг часовой пояс сменят, и вы не сможете сверить с Раулем, который родился в Испании в тот же час)

Многие (если не все) базы данных умеют хранить дату без таймзоны. Вот в таком виде и надо ее хранить. Тогда дата рождения не поплывет у клиентов в разных часовых поясах. А вот момент, когда поздравлять пациента - надо вычислять с учетом таймзоны поздравляемого - наступила эта дата там, или нет. И еще надо позаботиться о том, чтобы кроме СУБД еще какой-нибудь слой (backend или frontend) не произвел преобразование даты вида "дд.мм.гггг 00:00:00" в таймзону клиента.

Кстати, недавно столкнулся с паспортом (настоящим), где дата рождения была указана как "00.00.1946" (именно так, с нулями), которую в поле типа Дата и подобные внести никак нельзя. Я так понимаю, в МВД для даты рождения используется просто строка. И в данном случае, видимо, точная дата рождения была утеряна.

в базе данных понятное дело timestamp хранится без локального смещения — чисто как UTC+0. Но при отражении у пользователя включается локальный сдвиг

Какие-то странные выводы. Не смог их толком даже распарсить. Например, «всегда вводить свой UTC» — это что означает, для обработки дат рождения надо учитывать високосные секунды (которые являются частью UTC)?

Корректнее написать просто: дату/время надо всегда запрашивать и обрабатывать с учётом контекста применения. В частности, для даты рождения имеет смысл отдельная сущность, которая напрямую (конверсиями и т.д.) не связана с ISO датой/временем.
Не могу вспомнить ни одного сервиса, где бы требовался ввод времени рождения.
Sign up to leave a comment.

Articles