diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -135,6 +135,7 @@ 'PhutilCalendarAbsoluteDateTime' => 'parser/calendar/data/PhutilCalendarAbsoluteDateTime.php', 'PhutilCalendarContainerNode' => 'parser/calendar/data/PhutilCalendarContainerNode.php', 'PhutilCalendarDateTime' => 'parser/calendar/data/PhutilCalendarDateTime.php', + 'PhutilCalendarDateTimeTestCase' => 'parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php', 'PhutilCalendarDocumentNode' => 'parser/calendar/data/PhutilCalendarDocumentNode.php', 'PhutilCalendarDuration' => 'parser/calendar/data/PhutilCalendarDuration.php', 'PhutilCalendarEventNode' => 'parser/calendar/data/PhutilCalendarEventNode.php', @@ -732,6 +733,7 @@ 'PhutilCalendarAbsoluteDateTime' => 'PhutilCalendarDateTime', 'PhutilCalendarContainerNode' => 'PhutilCalendarNode', 'PhutilCalendarDateTime' => 'Phobject', + 'PhutilCalendarDateTimeTestCase' => 'PhutilTestCase', 'PhutilCalendarDocumentNode' => 'PhutilCalendarContainerNode', 'PhutilCalendarDuration' => 'Phobject', 'PhutilCalendarEventNode' => 'PhutilCalendarContainerNode', diff --git a/src/parser/calendar/data/PhutilCalendarDateTime.php b/src/parser/calendar/data/PhutilCalendarDateTime.php --- a/src/parser/calendar/data/PhutilCalendarDateTime.php +++ b/src/parser/calendar/data/PhutilCalendarDateTime.php @@ -46,16 +46,9 @@ } } - public function newAbsoluteDateTime() { - $epoch = $this->getEpoch(); - $timezone = nonempty($this->getTimezone(), 'UTC'); - return PhutilCalendarAbsoluteDateTime::newFromEpoch($epoch, $timezone) - ->setIsAllDay($this->getIsAllDay()) - ->setViewerTimezone($this->getViewerTimezone()); - } - abstract public function newPHPDateTimeZone(); abstract public function newPHPDateTime(); + abstract public function newAbsoluteDateTime(); abstract public function getTimezone(); } diff --git a/src/parser/calendar/data/PhutilCalendarProxyDateTime.php b/src/parser/calendar/data/PhutilCalendarProxyDateTime.php --- a/src/parser/calendar/data/PhutilCalendarProxyDateTime.php +++ b/src/parser/calendar/data/PhutilCalendarProxyDateTime.php @@ -14,6 +14,10 @@ return $this->proxy; } + public function __clone() { + $this->proxy = clone $this->proxy; + } + public function setViewerTimezone($timezone) { $this->getProxy()->setViewerTimezone($timezone); return $this; 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 @@ -50,4 +50,22 @@ return $datetime; } + public function newAbsoluteDateTime() { + $clone = clone $this; + $clone->setViewerTimezone(null); + + $datetime = $clone->newPHPDateTime(); + + return id(new PhutilCalendarAbsoluteDateTime()) + ->setYear((int)$datetime->format('Y')) + ->setMonth((int)$datetime->format('m')) + ->setDay((int)$datetime->format('d')) + ->setHour((int)$datetime->format('H')) + ->setMinute((int)$datetime->format('i')) + ->setSecond((int)$datetime->format('s')) + ->setIsAllDay($clone->getIsAllDay()) + ->setTimezone($clone->getTimezone()) + ->setViewerTimezone($this->getViewerTimezone()); + } + } diff --git a/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php b/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php @@ -0,0 +1,29 @@ +setTimezone('America/Los_Angeles') + ->setViewerTimezone('America/Chicago') + ->setIsAllDay(true); + + $this->assertEqual( + '20161128', + $start->getISO8601()); + + $end = $start + ->newAbsoluteDateTime() + ->setHour(0) + ->setMinute(0) + ->setSecond(0) + ->newRelativeDateTime('P1D') + ->newAbsoluteDateTime(); + + $this->assertEqual( + '20161129', + $end->getISO8601()); + } + + +}