derbyparty/derby-faq

Работа с датами в Дерби

Closed this issue · 7 comments

Привет, хочу спросить какие практики работы датой существуют в Дерби.
Сейчас Дерби записывает дату как стринг и разработчики говорят, что дату нужно хранить в виде тайштампа.

Проблема в том, что в обоих случаях происходит потеря информации, например часовой пояс теряется. Что если сайтом пользуются люди из разных часовых поясов? Ну или кто-то умышленно отвел часы назад?

Получается, создавать дату на клиенте — моветон — можно только на сервере.

Допустим, я создаю фейсбук и мне нужно вывести меню архива: https://www.dropbox.com/s/peawsgvw07o8z08/Screenshot%202014-07-26%2014.39.47.png

Из таймштампа не получить группировку по году. Остается хранить год (и месяц) отдельно (избыточность), допустим мы сделали это. Как тогда сделать запрос с группировкой (исходим из того что на клиенте мы не хотим грузить и фильтровать большие массивы данных)?

Насчет зон. Date.now() работает через UTC, но тем не менее проблемы с клиентами это не решает, как и с группировками.

Расскажу как делаем мы:

  • используем timestamps
  • дату в бд записываем только на сервере при помощи хуков
  • группировки (в нашем случае по дням - у нас чат) делаем при помощи реактивных функций. (нужно вывести некоторое количество сообщений сгруппировав их по дням - запускаем реактивную функцию, которая пробегается по всем загруженным на клиентвсем сообщениям и составляет список "дней" - во вьюхе выводим в двух циклах: первый по дням, второй по сообщениям)

Из таймштампа не получить группировку по году.
Мы без проблем достаем день из таймштампа и делаем группировку - все это на клиенте.

В чате у нас даты "from now" - они одинаково работают и на клиенте и на сервере (единственный костыль используем для их вывода unescape, чтобы аттач бининга не сломался). Если же нам нужно выводить именно клиентское время - на сервере выводим прозрачным шрифтом, на клиенте в create компоненты обновляем.

Часовой пояс не храним - нафига он нужен не понимаем :)

Как тогда сделать запрос с группировкой (исходим из того что на клиенте мы не хотим грузить и фильтровать большие массивы данных)?

Запросов с группировкой в монге не бывает (группировку сделаем на клиенте). Все сводится к тому, что нужно в запросе отобрать нужныйй год - это же не проблема date: {$lte: +Date('01012009')} к примеру. Монга это все позволяет без проблем.

Артур, спасибо за ответ.
Зона нужна, чтобы клиент корректную дату видел с учетом своей зоны.
Но в нашем случае грузить весь архив только для того чтобы построить меню это явная избыточность, со временем он станет большим, нужна группировка на уровне базы.

Добавил distinct и mapReduce в livedb-mongo. Нейт добавил aggrigate - так что теперь все есть.

Привет. Круто!