Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions build/psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3611,11 +3611,6 @@
<code><![CDATA[string]]></code>
</InvalidReturnType>
</file>
<file src="lib/private/DateTimeZone.php">
<InvalidScalarArgument>
<code><![CDATA[$timestamp]]></code>
</InvalidScalarArgument>
</file>
<file src="lib/private/Diagnostics/Query.php">
<ImplementedReturnTypeMismatch>
<code><![CDATA[float]]></code>
Expand Down
51 changes: 24 additions & 27 deletions lib/private/DateTimeZone.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,34 @@ public function __construct(IConfig $config, ISession $session) {
}

/**
* Get the timezone of the current user, based on their session information and config data
*
* @param bool|int $timestamp
* @return \DateTimeZone
* @inheritdoc
*/
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')) {
public function getTimeZone($timestamp = false, ?string $userId = null): \DateTimeZone {
$uid = $userId ?? $this->session->get('user_id');
$timezoneName = $this->config->getUserValue($uid, 'core', 'timezone', '');
if ($timezoneName === '') {
if ($uid === $userId && $this->session->exists('timezone')) {
return $this->guessTimeZoneFromOffset($this->session->get('timezone'), $timestamp);
}
$timeZone = $this->getDefaultTimeZone();
return $this->getDefaultTimeZone();
}

try {
return new \DateTimeZone($timeZone);
return new \DateTimeZone($timezoneName);
} catch (\Exception $e) {
\OC::$server->get(LoggerInterface::class)->debug('Failed to created DateTimeZone "' . $timeZone . '"', ['app' => 'datetimezone']);
return new \DateTimeZone($this->getDefaultTimeZone());
\OCP\Server::get(LoggerInterface::class)->debug('Failed to created DateTimeZone "' . $timezoneName . '"', ['app' => 'datetimezone']);
return $this->getDefaultTimeZone();
}
}

public function getDefaultTimeZone(): \DateTimeZone {
/** @var non-empty-string */
$timezone = $this->config->getSystemValueString('default_timezone', 'UTC');
try {
return new \DateTimeZone($timezone);
} catch (\Exception) {
// its always UTC see lib/base.php
return new \DateTimeZone('UTC');
}
}

Expand All @@ -60,7 +69,7 @@ public function getTimeZone($timestamp = false) {
* we try to find it manually, before falling back to UTC.
*
* @param mixed $offset
* @param bool|int $timestamp
* @param int|false $timestamp
* @return \DateTimeZone
*/
protected function guessTimeZoneFromOffset($offset, $timestamp) {
Expand Down Expand Up @@ -93,20 +102,8 @@ protected function guessTimeZoneFromOffset($offset, $timestamp) {
}

// No timezone found, fallback to UTC
\OC::$server->get(LoggerInterface::class)->debug('Failed to find DateTimeZone for offset "' . $offset . '"', ['app' => 'datetimezone']);
return new \DateTimeZone($this->getDefaultTimeZone());
\OCP\Server::get(LoggerInterface::class)->debug('Failed to find DateTimeZone for offset "' . $offset . '"', ['app' => 'datetimezone']);
return $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';
}
}
21 changes: 19 additions & 2 deletions lib/public/IDateTimeZone.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,27 @@
* @since 8.0.0
*/
interface IDateTimeZone {

/**
* Get the timezone for a given user.
* If a timestamp is passed the timezone for that given timestamp is retrieved (might differ due to DST).
* If no userId is passed the current user is used.
*
* @param bool|int $timestamp
* @param ?string $userId - The user to fetch the timezone for (defaults to current user)
* @return \DateTimeZone
* @since 8.0.0 - parameter $timestamp was added in 8.1.0
* @since 8.0.0
* @since 8.1.0 - parameter $timestamp was added
* @since 32.0.0 - parameter $userId was added
*/
public function getTimeZone($timestamp = false, ?string $userId = null);

/**
* Get the timezone configured as the default for this Nextcloud server.
* While the PHP timezone is always set to UTC in Nextcloud this is the timezone
* to use for all time offset calculations if no user value is specified.
*
* @since 32.0.0
*/
public function getTimeZone($timestamp = false);
public function getDefaultTimeZone(): \DateTimeZone;
}
Loading