我遇到以下问题。我正在使用icalendar gem(https://github.com/icalendar/icalendar)创建.ics日历文件。例如,我像这样写时间:
def make_ical(email)
cal = Icalendar::Calendar.new
cal.event do |e|
e.dtstart = Icalendar::Values::Datetime.new('20141230T193400')
e.dtend = Icalendar::Values::Datetime.new('20141230T213400')
..
end
end
但是当它构建.ics文件时,它显示的时间与我输入的时间不同。我怀疑它将它转换为某种时区。我怎么能阻止它这样做呢?或者也许有一种方法可以改变初始时间,所以如果它必须转换,它会正确转换它。请帮忙。
calendar.ics
档案:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:icalendar-ruby
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:20141231T173138Z
UID:...
DTSTART:20141011T081000
DTEND:20141012T081000
CLASS:PRIVATE
DESCRIPTION:Blah blah blah
SUMMARY:Secrets of Alchemy
BEGIN:VALARM
ACTION:EMAIL
TRIGGER:-P1D
DESCRIPTION:Event reminder
SUMMARY:Alarm notification
ATTENDEE:
ATTENDEE:
END:VALARM
END:VEVENT
END:VCALENDAR
不要注意结束时间,但在任何一个中,日期时间的时间部分都会发生变化。我想以某种方式显示正确的时间。
答案 0 :(得分:1)
添加Gemfile: -
gem 'tzinfo'
gem 'tzinfo-data'
然后进行更改: -
require 'icalendar/tzinfo'
require 'tzinfo'
cal = Icalendar::Calendar.new
event_start = DateTime.new 2014, 12, 30, 19, 34, 00
event_end = DateTime.new 2014, 12, 30, 21, 34, 00
tzid = "America/Chicago"
tz = TZInfo::Timezone.get tzid
timezone = tz.ical_timezone event_start
cal.add_timezone timezone
cal.event do |e|
e.dtstart = Icalendar::Values::DateTime.new event_start, 'tzid' => tzid
e.dtend = Icalendar::Values::DateTime.new event_end, 'tzid' => tzid
end
将此ics作为附件发送至电子邮件: -
attachments["schedule.ics"] = {:mime_type => 'text/calendar',
:content => cal.to_ical}
注意: -
event_start
和event_end
应与tzid
处于同一时区,然后它会自动将正确的时间转换为此ics文件打开的时区。
答案 1 :(得分:0)
在application.rb
我取消注释了行config.time_zone = 'My Time Zone'
。
现在它有效。
参考本指南:http://www.elabs.se/blog/36-working-with-time-zones-in-ruby-on-rails