全天活动icalendar gem

fch*_*sen 3 icalendar ruby-on-rails

我使用下面的方法设置一个事件,用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
Run Code Online (Sandbox Code Playgroud)

为了整天制作一个活动,它需要看起来像这样:

DTSTART;VALUE=DATE:20101117
DTEND;VALUE=DATE:20101119
Run Code Online (Sandbox Code Playgroud)

现在我正在使用

event.dtstart = "$VALUE=DATE:"+ev.start_at.strftime("%Y%m%d")"
Run Code Online (Sandbox Code Playgroud)

这将输出

DTSTART:$VALUE=DATE:20101117
Run Code Online (Sandbox Code Playgroud)

然后我用";"替换所有":$" 同

@allday = @calendar.to_ical.gsub(":$", ";")
Run Code Online (Sandbox Code Playgroud)

是否有更直接的方式来保存日期?

zet*_*tic 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
Run Code Online (Sandbox Code Playgroud)

现在有趣的部分.给定一个日历,您可以创建一个事件并传入一个块,该块使用其属性初始化日期:

calendar.event do
  dtstart Date.new(2010,11,17), ical_params = {"VALUE"=>"DATE"}
  dtend Date.new(2010,11,19), ical_params = {"VALUE"=>"DATE"}
end
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

上面的代码产生以下输出:

BEGIN:VEVENT
DTSTAMP:20150521T162712Z
UID:4c239930-15ba-44b4-a045-c6fae3d858d2
DTSTART;VALUE=DATE:20101117
DTEND;VALUE=DATE:20101118
END:VEVENT
Run Code Online (Sandbox Code Playgroud)

请注意,日期没有与之关联的时间。先前回复中的代码当前会产生时间。我必须研究icalendar的源代码才能找到此解决方案。

我希望这可以帮助其他人。

干杯!