diff options
author | Roeland Jago Douma <rullzer@owncloud.com> | 2016-04-29 13:13:47 +0200 |
---|---|---|
committer | Roeland Jago Douma <rullzer@owncloud.com> | 2016-04-29 13:13:47 +0200 |
commit | f5e0d6ae6adacc44d2e7821425af39ba0a7dc71a (patch) | |
tree | e717eb0e4f1b6b3485c6d7fbb1d2df195be9609a /lib/private/DateTimeZone.php | |
parent | 5b45f0f91448f109ff33d4fb03368a0405e1da10 (diff) | |
download | nextcloud-server-f5e0d6ae6adacc44d2e7821425af39ba0a7dc71a.tar.gz nextcloud-server-f5e0d6ae6adacc44d2e7821425af39ba0a7dc71a.zip |
Move more of \OC to PSR-4
* \OC\DateTimeFormatter
* \OC\DateTimeZone
* \OC\ForbiddenException
* \OC\HTTPHelper
* \OC\HintException
* \OC\LargeFileHelper
* \OC\Log
* \OC\NaturalSort
* \OC\NavigationManager
* \OC\NeedsUpdateException
* \OC\NotSquareException
Diffstat (limited to 'lib/private/DateTimeZone.php')
-rw-r--r-- | lib/private/DateTimeZone.php | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/lib/private/DateTimeZone.php b/lib/private/DateTimeZone.php new file mode 100644 index 00000000000..5359cd6b391 --- /dev/null +++ b/lib/private/DateTimeZone.php @@ -0,0 +1,127 @@ +<?php +/** + * @author Joas Schilling <nickvergessen@owncloud.com> + * @author Morris Jobke <hey@morrisjobke.de> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC; + + +use OCP\IConfig; +use OCP\IDateTimeZone; +use OCP\ISession; + +class DateTimeZone implements IDateTimeZone { + /** @var IConfig */ + protected $config; + + /** @var ISession */ + protected $session; + + /** + * Constructor + * + * @param IConfig $config + * @param ISession $session + */ + public function __construct(IConfig $config, ISession $session) { + $this->config = $config; + $this->session = $session; + } + + /** + * Get the timezone of the current user, based on his session information and config data + * + * @param bool|int $timestamp + * @return \DateTimeZone + */ + public function getTimeZone($timestamp = false) { + $timeZone = $this->config->getUserValue($this->session->get('user_id'), 'core', 'timezone', null); + if ($timeZone === null) { + if ($this->session->exists('timezone')) { + return $this->guessTimeZoneFromOffset($this->session->get('timezone'), $timestamp); + } + $timeZone = $this->getDefaultTimeZone(); + } + + try { + return new \DateTimeZone($timeZone); + } catch (\Exception $e) { + \OCP\Util::writeLog('datetimezone', 'Failed to created DateTimeZone "' . $timeZone . "'", \OCP\Util::DEBUG); + return new \DateTimeZone($this->getDefaultTimeZone()); + } + } + + /** + * Guess the DateTimeZone for a given offset + * + * We first try to find a Etc/GMT* timezone, if that does not exist, + * we try to find it manually, before falling back to UTC. + * + * @param mixed $offset + * @param bool|int $timestamp + * @return \DateTimeZone + */ + protected function guessTimeZoneFromOffset($offset, $timestamp) { + try { + // Note: the timeZone name is the inverse to the offset, + // so a positive offset means negative timeZone + // and the other way around. + if ($offset > 0) { + $timeZone = 'Etc/GMT-' . $offset; + } else { + $timeZone = 'Etc/GMT+' . abs($offset); + } + + return new \DateTimeZone($timeZone); + } catch (\Exception $e) { + // If the offset has no Etc/GMT* timezone, + // we try to guess one timezone that has the same offset + foreach (\DateTimeZone::listIdentifiers() as $timeZone) { + $dtz = new \DateTimeZone($timeZone); + $dateTime = new \DateTime(); + + if ($timestamp !== false) { + $dateTime->setTimestamp($timestamp); + } + + $dtOffset = $dtz->getOffset($dateTime); + if ($dtOffset == 3600 * $offset) { + return $dtz; + } + } + + // No timezone found, fallback to UTC + \OCP\Util::writeLog('datetimezone', 'Failed to find DateTimeZone for offset "' . $offset . "'", \OCP\Util::DEBUG); + return new \DateTimeZone($this->getDefaultTimeZone()); + } + } + + /** + * Get the default timezone of the server + * + * Falls back to UTC if it is not yet set. + * + * @return string + */ + protected function getDefaultTimeZone() { + $serverTimeZone = date_default_timezone_get(); + return $serverTimeZone ?: 'UTC'; + } +} |