FUJINAKA Tohru
2007-May-07  04:03 UTC
[iCalendar-devel] [patch] fix a bug parsing DATE turns to DATE-TIME
Hi,
In the current version 0.98, formatting DATE value is OK.
But parsing DATE value and formatting seems not.
  ical = Icalendar::Calendar.new
  ical.event { dtstart Date.new(2007, 5, 7) }
  puts ical.to_ical.match(/^dtstart\b[^\r\n]+/im)
  # -> DTSTART:20070507
  ical = Icalendar::parse(StringIO.new(ical.to_ical), true)
  puts ical.to_ical.match(/^dtstart\b[^\r\n]+/im)
  # -> DTSTART:20070507T000000
The following patch will fix it.
---[patch begin]---
diff -c /home/trac/ruby/gem/gems/icalendar-0.98/lib/icalendar/parser.rb.orig
/home/trac/ruby/gem/gems/icalendar-0.98/lib/icalendar/parser.rb
*** /home/trac/ruby/gem/gems/icalendar-0.98/lib/icalendar/parser.rb.orig       
Wed May  2 23:26:57 2007
--- /home/trac/ruby/gem/gems/icalendar-0.98/lib/icalendar/parser.rb     Mon May 
7 11:58:43 2007
***************
*** 318,324 ****
      # NOTE: invalid dates & times will be returned as strings...
      def parse_datetime(name, params, value)
        begin
!         DateTime.parse(value)
        rescue Exception
          value
        end
--- 318,324 ----
      # NOTE: invalid dates & times will be returned as strings...
      def parse_datetime(name, params, value)
        begin
!         value.match(/^\d{8}$/) ? Date.Parse(value) : DateTime.parse(value)
        rescue Exception
          value
        end
---[patch end]---
BTW, 
in the file conversions.rb there are to_ical() for Date, Time and DateTime.
These implementation looks a bit verbose to me.
Using strftime() will make them be simple, won''t it?
like: 
  s = strftime(''%Y%m%d'')
and
  s = strftime(''%Y%m%dT%H%M%S'')
  s << ''Z'' if utc?
Best regards,
-- 
FUJINAKA Tohru <tohru at nakarika.com>