Page MenuHomePhabricator

D16974.id40851.diff
No OneTemporary

D16974.id40851.diff

diff --git a/src/parser/calendar/data/PhutilCalendarRelativeDateTime.php b/src/parser/calendar/data/PhutilCalendarRelativeDateTime.php
--- a/src/parser/calendar/data/PhutilCalendarRelativeDateTime.php
+++ b/src/parser/calendar/data/PhutilCalendarRelativeDateTime.php
@@ -52,7 +52,10 @@
public function newAbsoluteDateTime() {
$clone = clone $this;
- $clone->setViewerTimezone(null);
+
+ if ($clone->getTimezone()) {
+ $clone->setViewerTimezone(null);
+ }
$datetime = $clone->newPHPDateTime();
diff --git a/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php b/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php
--- a/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php
+++ b/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php
@@ -23,6 +23,26 @@
$this->assertEqual(
'20161129',
$end->getISO8601());
+
+ // This is a date which explicitly has no specified timezone.
+ $start = PhutilCalendarAbsoluteDateTime::newFromISO8601('20161128', null)
+ ->setViewerTimezone('UTC');
+
+ $this->assertEqual(
+ '20161128',
+ $start->getISO8601());
+
+ $end = $start
+ ->newAbsoluteDateTime()
+ ->setHour(0)
+ ->setMinute(0)
+ ->setSecond(0)
+ ->newRelativeDateTime('P1D')
+ ->newAbsoluteDateTime();
+
+ $this->assertEqual(
+ '20161129',
+ $end->getISO8601());
}
diff --git a/src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php b/src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php
--- a/src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php
+++ b/src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php
@@ -216,6 +216,32 @@
$event->getEndDateTime()->getEpoch());
}
+ public function testICSWeeklyEvent() {
+ $event = $this->parseICSSingleEvent('weekly.ics');
+
+ $start = $event->getStartDateTime();
+ $start->setViewerTimezone('UTC');
+
+ $rrule = $event->getRecurrenceRule()
+ ->setStartDateTime($start);
+
+ $rset = id(new PhutilCalendarRecurrenceSet())
+ ->addSource($rrule);
+
+ $result = $rset->getEventsBetween(null, null, 3);
+
+ $expect = array(
+ PhutilCalendarAbsoluteDateTime::newFromISO8601('20150811'),
+ PhutilCalendarAbsoluteDateTime::newFromISO8601('20150818'),
+ PhutilCalendarAbsoluteDateTime::newFromISO8601('20150825'),
+ );
+
+ $this->assertEqual(
+ mpull($expect, 'getISO8601'),
+ mpull($result, 'getISO8601'),
+ pht('Weekly recurring event.'));
+ }
+
public function testICSParserErrors() {
$map = array(
'err-missing-end.ics' => PhutilICSParser::PARSE_MISSING_END,
diff --git a/src/parser/calendar/ics/__tests__/data/weekly.ics b/src/parser/calendar/ics/__tests__/data/weekly.ics
new file mode 100644
--- /dev/null
+++ b/src/parser/calendar/ics/__tests__/data/weekly.ics
@@ -0,0 +1,14 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND;VALUE=DATE:20150812
+LAST-MODIFIED:20160822T130015Z
+UID:4AE69E91-4A51-4B77-8849-85981E037A83
+DTSTAMP:20161129T152151Z
+SUMMARY:Weekly Event
+DTSTART;VALUE=DATE:20150811
+CREATED:20141109T163445Z
+RRULE:FREQ=WEEKLY
+END:VEVENT
+END:VCALENDAR

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 15, 9:17 PM (1 w, 1 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7703827
Default Alt Text
D16974.id40851.diff (3 KB)

Event Timeline