Parse ICS datetimes and durations
Summary:
Ref T10747. This parses "SUMMARY" and "DESCRIPTION" from ICS (easy) and "DTSTART", "DTEND" and "DURATION" (big mess, as one might reasonably expect).
ICS dates can be absolute (e.g., at a specific time in history) or "floating". If an event is "floating", it has a date like "June 23 at 5PM", which is expected to be interpreted according to the viewer timezone, i.e. occur at different times in different timezones.
Dates can also be "start + end" or "start + duration". Worse, they can be a floating start plus a duration. Do a bunch of gymnastics to represent all this stuff faithfully.
This probably still doesn't handle all-day events properly, but I'll deal with them in the future.
Test Plan: Added unit tests; ran unit tests.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10747
Differential Revision: https://secure.phabricator.com/D16548