Весь день событие icalendar gem - PullRequest
3 голосов
/ 02 декабря 2010

Я использую приведенное ниже, чтобы настроить событие для экспорта в ical с гемом icalendar.

@calendar = Icalendar::Calendar.new

event = Icalendar::Event.new
event.dtstart = ev.start_at.strftime("%Y%m%d")
event.dtend = ev.end_at.strftime("%Y%m%d")
event.summary = ev.summary

@calendar.add

Для того, чтобы создать событие в течение всего дня, оно должно выглядеть так:

DTSTART;VALUE=DATE:20101117
DTEND;VALUE=DATE:20101119

Прямо сейчас я использую

event.dtstart = "$VALUE=DATE:"+ev.start_at.strftime("%Y%m%d")"

Это выдаст

DTSTART:$VALUE=DATE:20101117

, а затем я заменю все ": $" на ";"с

@allday = @calendar.to_ical.gsub(":$", ";")

Есть ли более прямой способ сохранить даты как весь день?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2010

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

event = Icalendar::Event.new
event.dtstart = Date.new(2010,12,1)
event.dtstart.ical_params = { "VALUE" => "DATE" }
puts event.to_ical

# output
BEGIN:VEVENT
DTSTAMP:20101201T230134
DTSTART;VALUE=DATE:20101201
SEQUENCE:0
UID:2010-12-01T23:01:34-08:00_923426206@ubuntu
END:VEVENT

Теперь самое интересное. Учитывая календарь, вы можете создать событие и передать в блок, который инициализирует дату со своими свойствами:

calendar.event do
  dtstart Date.new(2010,11,17), ical_params = {"VALUE"=>"DATE"}
  dtend Date.new(2010,11,19), ical_params = {"VALUE"=>"DATE"}
end
4 голосов
/ 21 мая 2015

Так что эта ветка кажется довольно старой (и не решила проблему с самой последней версией гема icalendar - 2.3.0).Мне недавно пришлось создавать события календаря на весь день в формате ics.Я обнаружил, что это гораздо лучшее решение (и, похоже, оно работает так, как вы ожидаете, что календари его обработают) - см. Фрагмент ниже

date = Date.new(2010,11,17)
event = Icalendar::Event.new
event.dtstart = Icalendar::Values::Date.new date
event.dtstart.ical_param "VALUE", "DATE"
event.dtend = Icalendar::Values::Date.new (date + 1.day)
event.dtend.ical_param "VALUE", "DATE"
puts event.to_ical

Приведенный выше код выдает следующий вывод:

BEGIN:VEVENT
DTSTAMP:20150521T162712Z
UID:4c239930-15ba-44b4-a045-c6fae3d858d2
DTSTART;VALUE=DATE:20101117
DTEND;VALUE=DATE:20101118
END:VEVENT

Обратите внимание, что с датой не связано время.Код в предыдущем ответе в настоящее время производит время.Мне пришлось покопаться в исходном коде icalendar, чтобы выяснить это решение.

Надеюсь, это поможет кому-то еще.

Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...