From 814114ab8eda5d383f4c620f3854cfefcdb6895d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 22 Sep 2014 15:03:28 +0200 Subject: [PATCH] enhance formatDate function to accept an optional argument containing the time zone --- lib/private/util.php | 24 +++++++++++++++++------- lib/public/util.php | 6 ++++-- tests/lib/util.php | 24 ++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/lib/private/util.php b/lib/private/util.php index c5483c1654..4d1287bcc8 100755 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -383,16 +383,26 @@ class OC_Util { * * @param int $timestamp * @param bool $dateOnly option to omit time from the result + * @param DateTimeZone|string $timeZone where the given timestamp shall be converted to * @return string timestamp * @description adjust to clients timezone if we know it */ - public static function formatDate( $timestamp, $dateOnly = false) { - if(\OC::$server->getSession()->exists('timezone')) { - $systemTimeZone = intval(date('O')); - $systemTimeZone = (round($systemTimeZone / 100, 0) * 60) + ($systemTimeZone % 100); - $clientTimeZone = \OC::$server->getSession()->get('timezone') * 60; - $offset = $clientTimeZone - $systemTimeZone; - $timestamp = $timestamp + $offset * 60; + public static function formatDate($timestamp, $dateOnly = false, $timeZone = null) { + if (is_null($timeZone)) { + if (\OC::$server->getSession()->exists('timezone')) { + $systemTimeZone = intval(date('O')); + $systemTimeZone = (round($systemTimeZone / 100, 0) * 60) + ($systemTimeZone % 100); + $clientTimeZone = \OC::$server->getSession()->get('timezone') * 60; + $offset = $clientTimeZone - $systemTimeZone; + $timestamp = $timestamp + $offset * 60; + } + } else { + if (!$timeZone instanceof DateTimeZone) { + $timeZone = new DateTimeZone($timeZone); + } + $dt = new DateTime("@$timestamp"); + $offset = $timeZone->getOffset($dt); + $timestamp += $offset; } $l = \OC::$server->getL10N('lib'); return $l->l($dateOnly ? 'date' : 'datetime', $timestamp); diff --git a/lib/public/util.php b/lib/public/util.php index 244c11ba2c..35847fce38 100644 --- a/lib/public/util.php +++ b/lib/public/util.php @@ -29,6 +29,7 @@ // use OCP namespace for all classes that are considered public. // This means that they should be used by apps instead of the internal ownCloud classes namespace OCP; +use DateTimeZone; /** * This class provides different helper functions to make the life of a developer easier @@ -167,10 +168,11 @@ class Util { * formats a timestamp in the "right" way * @param int $timestamp $timestamp * @param bool $dateOnly option to omit time from the result + * @param DateTimeZone|string $timeZone where the given timestamp shall be converted to * @return string timestamp */ - public static function formatDate( $timestamp, $dateOnly=false) { - return(\OC_Util::formatDate( $timestamp, $dateOnly )); + public static function formatDate($timestamp, $dateOnly=false, $timeZone = null) { + return(\OC_Util::formatDate($timestamp, $dateOnly, $timeZone)); } /** diff --git a/tests/lib/util.php b/tests/lib/util.php index 8964f9f266..e43b6309ea 100644 --- a/tests/lib/util.php +++ b/tests/lib/util.php @@ -37,6 +37,30 @@ class Test_Util extends PHPUnit_Framework_TestCase { $this->assertEquals($expected, $result); } + function testFormatDateWithTZ() { + date_default_timezone_set("UTC"); + + $result = OC_Util::formatDate(1350129205, false, 'Europe/Berlin'); + $expected = 'October 13, 2012 13:53'; + $this->assertEquals($expected, $result); + } + + /** + * @expectedException Exception + */ + function testFormatDateWithInvalidTZ() { + OC_Util::formatDate(1350129205, false, 'Mordor/Barad-dûr'); + } + + function testFormatDateWithTZFromSession() { + date_default_timezone_set("UTC"); + + \OC::$server->getSession()->set('timezone', 3); + $result = OC_Util::formatDate(1350129205, false); + $expected = 'October 13, 2012 14:53'; + $this->assertEquals($expected, $result); + } + function testCallRegister() { $result = strlen(OC_Util::callRegister()); $this->assertEquals(30, $result);