diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php b/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php index b51ade4d74d..f62e989fd64 100644 --- a/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php +++ b/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php @@ -17,6 +17,7 @@ use OCP\IConfig; use OCP\IDateTimeFormatter; use OCP\IURLGenerator; use OCP\IUserManager; +use OCP\IUserSession; use OCP\L10N\IFactory as IL10NFactory; class LocalTimeProvider implements IProvider { @@ -28,6 +29,7 @@ class LocalTimeProvider implements IProvider { private ITimeFactory $timeFactory, private IDateTimeFormatter $dateTimeFormatter, private IConfig $config, + private IUserSession $currentSession, ) { } @@ -35,14 +37,51 @@ class LocalTimeProvider implements IProvider { $targetUserId = $entry->getProperty('UID'); $targetUser = $this->userManager->get($targetUserId); if (!empty($targetUser)) { - $timezone = $this->config->getUserValue($targetUser->getUID(), 'core', 'timezone') ?: $this->config->getSystemValueString('default_timezone', 'UTC'); - $dateTimeZone = new \DateTimeZone($timezone); - $localTime = $this->dateTimeFormatter->formatTime($this->timeFactory->getDateTime(), 'short', $dateTimeZone); + $timezoneStringTarget = $this->config->getUserValue($targetUser->getUID(), 'core', 'timezone') ?: $this->config->getSystemValueString('default_timezone', 'UTC'); + $timezoneTarget = new \DateTimeZone($timezoneStringTarget); + $localTimeTarget = $this->timeFactory->getDateTime('now', $timezoneTarget); + $localTimeString = $this->dateTimeFormatter->formatTime($localTimeTarget, 'short', $timezoneTarget); - $iconUrl = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'actions/recent.svg')); $l = $this->l10nFactory->get('lib'); - $profileActionText = $l->t('Local time: %s', [$localTime]); + $currentUser = $this->currentSession->getUser(); + if ($currentUser !== null) { + $timezoneStringCurrent = $this->config->getUserValue($currentUser->getUID(), 'core', 'timezone') ?: $this->config->getSystemValueString('default_timezone', 'UTC'); + $timezoneCurrent = new \DateTimeZone($timezoneStringCurrent); + $localTimeCurrent = $this->timeFactory->getDateTime('now', $timezoneCurrent); + + // Get the timezone offsets to GMT on this very time (needed to handle daylight saving time) + $timeOffsetCurrent = $timezoneCurrent->getOffset($localTimeCurrent); + $timeOffsetTarget = $timezoneTarget->getOffset($localTimeTarget); + // Get the difference between the current users offset to GMT and then targets user to GMT + $timeOffset = $timeOffsetTarget - $timeOffsetCurrent; + if ($timeOffset === 0) { + // No offset means both users are in the same timezone + $timeOffsetString = $l->t('same time'); + } else { + // We need to cheat here as the offset could be up to 26h we can not use formatTime. + $hours = abs((int)($timeOffset / 3600)); + $minutes = abs(($timeOffset / 60) % 60); + // TRANSLATORS %n hours in a short form + $hoursString = $l->n('%nh', '%nh', $hours); + // TRANSLATORS %n minutes in a short form + $minutesString = $l->n('%nm', '%nm', $minutes); + + $timeOffsetString = ($hours > 0 ? $hoursString : '') . ($minutes > 0 ? $minutesString : ''); + if ($timeOffset > 0) { + // TRANSLATORS meaning the user is %s time ahead - like 1h30m + $timeOffsetString = $l->t('%s ahead', [$timeOffsetString]); + } else { + // TRANSLATORS meaning the user is %s time behind - like 1h30m + $timeOffsetString = $l->t('%s behind', [$timeOffsetString]); + } + } + $profileActionText = "{$localTimeString} • {$timeOffsetString}"; + } else { + $profileActionText = $l->t('Local time: %s', [$localTimeString]); + } + + $iconUrl = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'actions/recent.svg')); $action = $this->actionFactory->newLinkAction($iconUrl, $profileActionText, '#', 'timezone'); // Order after the profile page $action->setPriority(19); |