Елена Б.
6863 сообщения
#13 лет назад
В абсолютно неожиданном месте столкнулась с проблемой, решение которой не могу найти уже несколько дней.
Делается календарь событий. Работает только с датами. Время не указывается.
При создании новой записи происходит проверка, свободна ли эта дата.
И вот сюрприз. Как со стороны MySQL так и со стороны Javascript происходит поправка даты на часовой пояс, в результате сравнение дат по состоянию на 00.00 не дает правильный результат.

Помогите, пожалуйста, избавиться от часового пояса или хотя бы придумать рабочий костыль для сравнения дат.
Гугл как-то ничего не дает, нормальных людей волнует вопрос как работу с разными поясами наладить, а мне ее убить надо.
Евгений О.
2989 сообщений
#13 лет назад
Что-то из этого не подойдет?

javascript
x = new Date();
currentTimeZoneOffsetInHours = -x.getTimezoneOffset()/60; //в часах

mysql
SELECT @@global.time_zone, @@session.time_zone;
Кирилл Е.
2817 сообщений
#13 лет назад
В сервера одно время, в пользователя другое.
Вести календарь по времени на сервере, в пользователя не факт что правильная дата.
Елена Б.
6863 сообщения
#13 лет назад
elosoft, по javascript может и подойдет.

Но в целом это же идиотизм... дополнительные преобразования когда задача ПРОЩЕ... Текущая дата в задаче вообще не гребет. Крыжик поставили - в базу занеслось. Другой пользователь уже отметить тот же день не может. И вот такая мелочь (сравнение) не получается. Убица апстену..

В строках что ли вообще хранить его (varchar)?
Евгений Кашкаров
450 сообщений
#13 лет назад
Т.е. вам нужно просто сравнить даты? А какой тип поля? Проверьте, может у вас там datetime какой-нибудь и в нём хранится время с точностью до секунды. Тогда две записи сделаные в один день но в разное время н ебудут равны
Андрей Халецкий
3562 сообщения
#13 лет назад
Вообще работа со временем штука коварная, но вы судя по описанию используете поле для хранения времени в месте где нужно хранить дату ()
Евгений О.
2989 сообщений
#13 лет назад
Вообще, по моей практике, если где-то когда-то изначально вогнали ошибку в определении дат (передернули клиентское и серверное время), то единственный реальный способ это затащить в переменную javascript правильную дату (с сервера, mysql и т.п.) и каждый раз перед отправкой даты проверять ее. Нудно, но выполнимо.
Елена Б.
6863 сообщения
#13 лет назад
Так текущая дата не имеет никакого значения.
У меня +2, на сервере +3
Отправляю на сервер две даты: от и до. Уже строкой отправляю банально.
Скрипт тянет из базы даты забитые ранее.
Чтоб пройтись по диапазону, преобразует все в UnixTime. Вот тут подстава. Даты из базы все имеют время 01.00.00. А новые создаются со временем 00.00.00. И естественно, не сравниваются. Хотя казалось бы, все преобразования производятся на сервере?
Евгений Кашкаров
450 сообщений
#13 лет назад
Цитата ("floppox"):
Даты из базы все имеют время 01.00.00.

Дата - это только год, месяц и число, зачем вы храните ВРЕМЯ?
Цитата ("floppox"):
Чтоб пройтись по диапазону, преобразует все в UnixTime.

Можно на этой стадии просто отсекать часы, минуты и секунды и потом сравнивать
Елена Б.
6863 сообщения
#13 лет назад
В том все дело, что ВРЕМЯ не хранится. Но именно при преобразовании в UnixTime к датам из базы какого-то лешего приплюсовывается один час.

Короче, помогло привести все к строкам и потом в одном месте юникстайм получать. Вроде не слишком страшно получилось.
Но мне пожалуй в клуб глупых пора )))) Столько времени бодаться. Теперь думаю, че сразу так не сделала. Изначально в виде метки он передавалось и из базы и от клиента, потом запуталась, наверное, когда с типами экспериментировать начала.