全天事件 icalendar 宝石

3
我正在使用以下内容设置一个事件,以便使用icalendar gem导出到ical中。
@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

看起来这个帖子很老了(并且在最新版本的icalendar gem 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

请注意,Date对象本身没有与之关联的时间。在先前的回复代码中,它目前生成了时间,我不得不深入研究icalendar的源代码才找到这个解决方案。
我希望这对其他人有所帮助。
干杯!

5

我玩了一下,找到了一种方法。你可以给事件日期分配属性,以键值对的形式。所以你可以这样分配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

这似乎是一个更好的方法。谢谢。 - fchasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接