Что лучший способ состоит в том, чтобы смоделировать повторяющиеся события в календарном приложении?

Хотя это явно не указано для setTimestamp(int parameterIndex, Timestamp x), драйверы должны следовать правилам, установленным setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc :

Устанавливает назначенный параметр в заданное значение java.sql.Timestamp, используя данный объект Calendar. Драйвер использует объект Calendar для построения значения SQL TIMESTAMP, которое затем отправляет драйвер в базу данных. С помощью объекта Calendar драйвер может вычислять временную метку с учетом пользовательского часового пояса. Если объект Calendar не указан, драйвер использует часовой пояс по умолчанию, который используется для виртуальной машины, на которой запущено приложение.

blockquote>

Когда вы звоните с помощью setTimestamp(int parameterIndex, Timestamp x), драйвер JDBC использует часовой пояс виртуальной машины для расчета даты и времени временной метки в этом часовом поясе. Эта дата и время - это то, что хранится в базе данных, и если столбец базы данных не хранит информацию о часовом поясе, тогда любая информация о зоне теряется (что означает, что она зависит от приложения (ов), использующего базу данных, чтобы использовать (например, сохранить в отдельной колонке).

Например: Ваш часовой пояс GMT + 2. Вы сохраняете «2012-12-25 10 : 00: 00 UTC ". Фактическое значение, хранящееся в базе данных, -« 2012-12-25 12:00:00 ». Вы возвращаете его снова: вы возвращаете его снова как« 2012-12-25 10:00:00 UTC "(но только если вы извлечете его с помощью getTimestamp(..)), но когда другое приложение обратится к базе данных в часовом поясе GMT ​​+ 0, оно будет получать временную метку как« 2012-12-25 12:00:00 UTC ».

Если вы хотите сохранить его в другом часовом поясе, вам нужно использовать setTimestamp(int parameterIndex, Timestamp x, Calendar cal) с экземпляром календаря в требуемом часовом поясе. Просто убедитесь, что вы также используете эквивалентный геттер с тем же часовым поясом, когда получение значений (если вы se TIMESTAMP без информации о часовом поясе в вашей базе данных).

Итак, если вы хотите сохранить фактический часовой пояс GMT, вам нужно использовать:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);

С JDBC 4.2 совместимый драйвер должен поддерживать java.time.LocalDateTimejava.time.LocalTime) для TIMESTAMPTIME) через get/set/updateObject. Классы java.time.Local* не имеют временных зон, поэтому преобразование не требуется (хотя это может открыть новый набор проблем, если ваш код действительно принял определенный часовой пояс).

213
задан bdukes 23 September 2008 в 21:05
поделиться

11 ответов

Я использовал бы понятие 'ссылки' для всех будущих повторяющихся событий. Они динамично отображены в календаре и связываются назад с единственным ссылочным объектом. Когда события произошли, связь разорвана, и событие становится автономным экземпляром. При попытке отредактировать повторяющееся событие, тогда запрашивают, чтобы изменить все будущие объекты (т.е. изменить единственную связанную ссылку) или изменение просто, что экземпляр (в этом случае преобразовывают это в автономный экземпляр и затем вносят изменение). Последний, в корпусе, немного проблематичен, поскольку необходимо отслеживать в повторяющемся списке всех будущих событий, которые были преобразованы в единственный экземпляр. Но, это совершенно выполнимо.

Так, в сущности, имеют 2 класса событий - единственные экземпляры и повторяющиеся события.

84
ответ дан user16068 4 November 2019 в 14:02
поделиться

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

при запросах повторяющегося события оно может проверить на определенное переопределение в течение того дня.

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

, Если пользователь просит удалять все повторения этого события, Вы также имеете список специфических особенностей для вручения и можете удалить их легко.

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

0
ответ дан Andrew Johnson 4 November 2019 в 14:02
поделиться

Вы могли сохранить события как повторение, и если конкретный экземпляр был отредактирован, создайте новое событие с тем же идентификатором события. Тогда при поиске события, ищите все события с тем же идентификатором события для получения всей информации. Я не уверен, прокрутили ли Вы свою собственную библиотеку события, или если Вы используете существующий, таким образом, это не может быть возможно.

2
ответ дан Vincent McNabb 4 November 2019 в 14:02
поделиться

Из этих ответов у меня есть вид просеянных решение. Мне действительно нравится идея понятия ссылки. Повторяющиеся события могли быть связанным списком с хвостом, зная его правило повторения. Изменение одного события тогда было бы легко, потому что ссылки остаются на месте, и удаление события легко также - Вы просто расцепляете событие, удаляете его и повторно связываете событие прежде и после него. Все еще необходимо запросить повторяющиеся события каждый раз, когда кто-то смотрит на новый период времени, никогда не, смотрел на прежде на календаре, но иначе это довольно чисто.

3
ответ дан Clinton N. Dreisbach 4 November 2019 в 14:02
поделиться
  1. Отслеживают правило повторения (вероятно, на основе iCalendar, на Kris K. ). Это будет включать шаблон и диапазон (Каждый третий вторник для 10 случаев).
  2. Для того, когда Вы хотите редактировать/удалять определенное возникновение, отслеживайте даты исключения вышеупомянутого правила повторения (даты, где событие не делает , происходят, поскольку правило определяет).
  3. , Если Вы удалили, это - все, в чем Вы нуждаетесь, если Вы отредактировали, создайте другое событие и дайте ему родительский идентификационный набор основному событию. Можно выбрать, включать ли всю информацию основного события в этой записи, или если это только содержит изменения и наследовало все, что не изменяется.

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

Hope, которая помогает!

5
ответ дан Community 4 November 2019 в 14:02
поделиться

Я рекомендовал бы использовать питание библиотеки даты и семантику модуля диапазона рубина. Повторяющееся событие является действительно временем, диапазон дат (запуск & конец) и обычно единственный день недели. Используя дату & диапазон можно ответить на любой вопрос:

#!/usr/bin/ruby
require 'date'

start_date = Date.parse('2008-01-01')
end_date   = Date.parse('2008-04-01')
wday = 5 # friday

(start_date..end_date).select{|d| d.wday == wday}.map{|d| d.to_s}.inspect

Производит все дни события, включая високосный год!

# =>"[\"2008-01-04\", \"2008-01-11\", \"2008-01-18\", \"2008-01-25\", \"2008-02-01\", \"2008-02-08\", \"2008-02-15\", \"2008-02-22\", \"2008-02-29\", \"2008-03-07\", \"2008-03-14\", \"2008-03-21\", \"2008-03-28\"]"
4
ответ дан Purfideas 4 November 2019 в 14:02
поделиться

Можно хотеть посмотреть на iCalendar реализации программного обеспечения или сам стандарт (<забастовка> RFC 2445 RFC 5545 ). Чтобы прийти на ум быстро являются проектами Mozilla http://www.mozilla.org/projects/calendar/ А, который быстрый поиск показывает http://icalendar.rubyforge.org/ также.

Другие опции можно рассмотреть в зависимости от того, как Вы собираетесь сохранить события. Вы создаете свою собственную схему базы данных? Используя что-то находящееся в iCalendar, и т.д.?

17
ответ дан Kris Kumler 4 November 2019 в 14:02
поделиться

Для программистов .NET, готовых платить некоторые лицензионные сборы, вы можете найти Aspose.Network полезным ... он включает совместимую с iCalendar библиотеку для повторяющихся встреч.

0
ответ дан 23 November 2019 в 04:29
поделиться

Может быть много проблем с повторяющимися событиями, позвольте мне выделить несколько, о которых я знаю.

Решение 1 - нет экземпляров

Сохранять исходные данные о встрече + повторения, не сохранять все экземпляры.

Проблемы:

  • Вам придется вычислять все экземпляры в окне даты, когда они вам понадобятся, дорого.
  • Невозможно обработать исключения (например, вы удаляете один из экземпляров или перемещаете это, или, скорее, вы не можете сделать это с этим решением)

Решение 2 - сохранить экземпляры

Сохраните все, начиная с 1, но также и все экземпляры, связанные с исходной встречей.

Проблемы:

  • Занимает много места (но пространство дешево, поэтому незначительно)
  • Исключения необходимо обрабатывать аккуратно, особенно если вы вернетесь и отредактируете исходную встречу после создания исключения. Например, если вы переместите третий экземпляр на один день вперед, что, если вы вернетесь и отредактируете время исходной встречи, снова вставите другую в исходный день и оставите перенесенную? Отключить перемещенный? Попытаться изменить перемещенный вариант соответствующим образом?

Конечно, если вы не собираетесь делать исключения, тогда подойдет любое решение, и вы в основном выбираете сценарий компромисса времени / пространства.

32
ответ дан 23 November 2019 в 04:29
поделиться

Я использую схему базы данных, как описано ниже, для хранения параметров повторения

http://github.com/bakineggs/recurring_events_for

Затем я использую runt для динамического вычисления даты.

https://github.com/mlipper/runt

6
ответ дан 23 November 2019 в 04:29
поделиться

Что, если у вас есть повторяющаяся встреча без даты окончания? Поскольку пространство в том, что у вас нет бесконечного пространства, поэтому решение 2 - не стартер там ...

Могу ли я предложить, чтобы «дата окончания» не может быть разрешена до даты окончания в конце век Даже на дневное событие количество места остается дешевым.

-5
ответ дан 23 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: