Merge pull request #10818 from MrPetovan/task/10691-remove-event-adjust

Display the current timezone in date time picker fields
This commit is contained in:
Michael Vogel 2021-10-03 21:46:33 +02:00 committed by GitHub
commit caa1a5aeac
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
38 changed files with 662 additions and 710 deletions

View file

@ -40,6 +40,7 @@ use Friendica\Model\Profile;
use Friendica\Module\Special\HTTPException as ModuleHTTPException;
use Friendica\Network\HTTPException;
use Friendica\Util\ConfigFileLoader;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\HTTPSignature;
use Friendica\Util\Profiler;
use Friendica\Util\Strings;
@ -217,12 +218,13 @@ class App
/**
* Set the timezone
*
* @param int $timezone
* @param string $timezone A valid time zone identifier, see https://www.php.net/manual/en/timezones.php
* @return void
*/
public function setTimeZone(string $timezone)
{
$this->timezone = $timezone;
$this->timezone = (new \DateTimeZone($timezone))->getName();
DateTimeFormat::setLocalTimeZone($this->timezone);
}
/**
@ -338,6 +340,9 @@ class App
{
set_time_limit(0);
// Ensure that all "strtotime" operations do run timezone independent
date_default_timezone_set('UTC');
// This has to be quite large to deal with embedded private photos
ini_set('pcre.backtrack_limit', 500000);
@ -372,15 +377,13 @@ class App
private function loadDefaultTimezone()
{
if ($this->config->get('system', 'default_timezone')) {
$this->timezone = $this->config->get('system', 'default_timezone');
$timezone = $this->config->get('system', 'default_timezone', 'UTC');
} else {
global $default_timezone;
$this->timezone = !empty($default_timezone) ? $default_timezone : 'UTC';
$timezone = $default_timezone ?? '' ?: 'UTC';
}
if ($this->timezone) {
date_default_timezone_set($this->timezone);
}
$this->setTimeZone($timezone);
}
/**

View file

@ -1857,7 +1857,6 @@ class BBCode
$text = preg_replace("/\[event\-start\](.*?)\[\/event\-start\]/ism", $sub, $text);
$text = preg_replace("/\[event\-finish\](.*?)\[\/event\-finish\]/ism", '', $text);
$text = preg_replace("/\[event\-location\](.*?)\[\/event\-location\]/ism", '', $text);
$text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/ism", '', $text);
$text = preg_replace("/\[event\-id\](.*?)\[\/event\-id\]/ism", '', $text);
}

View file

@ -61,9 +61,6 @@ class Worker
*/
public static function processQueue($run_cron = true)
{
// Ensure that all "strtotime" operations do run timezone independent
date_default_timezone_set('UTC');
self::$up_start = microtime(true);
// At first check the maximum load. We shouldn't continue with a high load

View file

@ -51,16 +51,10 @@ class Event
$bd_format = DI::l10n()->t('l F d, Y \@ g:i A'); // Friday January 18, 2011 @ 8 AM.
$event_start = DI::l10n()->getDay(
!empty($event['adjust']) ?
DateTimeFormat::local($event['start'], $bd_format) : DateTimeFormat::utc($event['start'], $bd_format)
);
$event_start = DI::l10n()->getDay(DateTimeFormat::local($event['start'], $bd_format));
if (!empty($event['finish'])) {
$event_end = DI::l10n()->getDay(
!empty($event['adjust']) ?
DateTimeFormat::local($event['finish'], $bd_format) : DateTimeFormat::utc($event['finish'], $bd_format)
);
$event_end = DI::l10n()->getDay(DateTimeFormat::local($event['finish'], $bd_format));
} else {
$event_end = '';
}
@ -94,13 +88,13 @@ class Event
$o .= '<div class="summary event-summary">' . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['summary']), $simple) . '</div>' . "\r\n";
$o .= '<div class="event-start"><span class="event-label">' . DI::l10n()->t('Starts:') . '</span>&nbsp;<span class="dtstart" title="'
. DateTimeFormat::utc($event['start'], (!empty($event['adjust']) ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s'))
. DateTimeFormat::local($event['start'], DateTimeFormat::ATOM)
. '" >' . $event_start
. '</span></div>' . "\r\n";
if (!$event['nofinish']) {
$o .= '<div class="event-end" ><span class="event-label">' . DI::l10n()->t('Finishes:') . '</span>&nbsp;<span class="dtend" title="'
. DateTimeFormat::utc($event['finish'], (!empty($event['adjust']) ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s'))
. DateTimeFormat::local($event['finish'], DateTimeFormat::ATOM)
. '" >' . $event_end
. '</span></div>' . "\r\n";
}
@ -157,10 +151,6 @@ class Event
$o .= '[event-location]' . $event['location'] . '[/event-location]';
}
if ($event['adjust']) {
$o .= '[event-adjust]' . $event['adjust'] . '[/event-adjust]';
}
return $o;
}
@ -200,11 +190,6 @@ class Event
$ev['location'] = $match[1];
}
$match = [];
if (preg_match("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is", $text, $match)) {
$ev['adjust'] = $match[1];
}
$ev['nofinish'] = !empty($ev['start']) && empty($ev['finish']) ? 1 : 0;
return $ev;
@ -218,8 +203,8 @@ class Event
private static function compareDatesCallback($event_a, $event_b)
{
$date_a = (($event_a['adjust']) ? DateTimeFormat::local($event_a['start']) : $event_a['start']);
$date_b = (($event_b['adjust']) ? DateTimeFormat::local($event_b['start']) : $event_b['start']);
$date_a = DateTimeFormat::local($event_a['start']);
$date_b = DateTimeFormat::local($event_b['start']);
if ($date_a === $date_b) {
return strcasecmp($event_a['desc'], $event_b['desc']);
@ -274,7 +259,6 @@ class Event
$event['allow_gid'] = $arr['allow_gid'] ?? '';
$event['deny_cid'] = $arr['deny_cid'] ?? '';
$event['deny_gid'] = $arr['deny_gid'] ?? '';
$event['adjust'] = intval($arr['adjust'] ?? 0);
$event['nofinish'] = intval($arr['nofinish'] ?? (!empty($event['start']) && empty($event['finish'])));
$event['created'] = DateTimeFormat::utc(($arr['created'] ?? '') ?: 'now');
@ -305,7 +289,6 @@ class Event
'desc' => $event['desc'],
'location' => $event['location'],
'type' => $event['type'],
'adjust' => $event['adjust'],
'nofinish' => $event['nofinish'],
];
@ -547,8 +530,6 @@ class Event
* int 'ignore' =>
* string 'start' => Start time of the timeframe.
* string 'finish' => Finish time of the timeframe.
* string 'adjust_start' =>
* string 'adjust_finish' =>
*
* @param string $sql_extra Additional sql conditions (e.g. permission request).
*
@ -568,11 +549,11 @@ class Event
$events = DBA::toArray(DBA::p("SELECT `event`.*, `post-user`.`id` AS `itemid` FROM `event`
LEFT JOIN `post-user` ON `post-user`.`event-id` = `event`.`id` AND `post-user`.`uid` = `event`.`uid`
WHERE `event`.`uid` = ? AND `event`.`ignore` = ?
AND ((NOT `adjust` AND (`finish` >= ? OR (`nofinish` AND `start` >= ?)) AND `start` <= ?)
OR (`adjust` AND (`finish` >= ? OR (`nofinish` AND `start` >= ?)) AND `start` <= ?))" . $sql_extra,
$owner_uid, $event_params["ignore"],
$event_params["start"], $event_params["start"], $event_params["finish"],
$event_params["adjust_start"], $event_params["adjust_start"], $event_params["adjust_finish"]));
AND (`finish` >= ? OR (`nofinish` AND `start` >= ?)) AND `start` <= ?
" . $sql_extra,
$owner_uid, $event_params['ignore'],
$event_params['start'], $event_params['start'], $event_params['finish']
));
if (DBA::isResult($events)) {
$return = self::removeDuplicates($events);
@ -604,15 +585,15 @@ class Event
$event = array_merge($event, $item);
$start = $event['adjust'] ? DateTimeFormat::local($event['start'], 'c') : DateTimeFormat::utc($event['start'], 'c');
$j = $event['adjust'] ? DateTimeFormat::local($event['start'], 'j') : DateTimeFormat::utc($event['start'], 'j');
$day = $event['adjust'] ? DateTimeFormat::local($event['start'], $fmt) : DateTimeFormat::utc($event['start'], $fmt);
$start = DateTimeFormat::local($event['start'], 'c');
$j = DateTimeFormat::local($event['start'], 'j');
$day = DateTimeFormat::local($event['start'], $fmt);
$day = DI::l10n()->getDay($day);
if ($event['nofinish']) {
$end = null;
} else {
$end = $event['adjust'] ? DateTimeFormat::local($event['finish'], 'c') : DateTimeFormat::utc($event['finish'], 'c');
$end = DateTimeFormat::local($event['finish'], 'c');
}
$is_first = ($day !== $last_date);
@ -720,23 +701,14 @@ class Event
// but test your solution against http://icalvalid.cloudapp.net/
// also long lines SHOULD be split at 75 characters length
foreach ($events as $event) {
if ($event['adjust'] == 1) {
$UTC = 'Z';
} else {
$UTC = '';
}
$o .= 'BEGIN:VEVENT' . PHP_EOL;
if ($event['start']) {
$tmp = strtotime($event['start']);
$dtformat = "%Y%m%dT%H%M%S" . $UTC;
$o .= 'DTSTART:' . strftime($dtformat, $tmp) . PHP_EOL;
$o .= 'DTSTART:' . DateTimeFormat::utc($event['start'], 'Ymd\THis\Z') . PHP_EOL;
}
if (!$event['nofinish']) {
$tmp = strtotime($event['finish']);
$dtformat = "%Y%m%dT%H%M%S" . $UTC;
$o .= 'DTEND:' . strftime($dtformat, $tmp) . PHP_EOL;
$o .= 'DTEND:' . DateTimeFormat::utc($event['finish'], 'Ymd\THis\Z') . PHP_EOL;
}
if ($event['summary']) {
@ -793,7 +765,7 @@ class Event
return $return;
}
$fields = ['start', 'finish', 'adjust', 'summary', 'desc', 'location', 'nofinish'];
$fields = ['start', 'finish', 'summary', 'desc', 'location', 'nofinish'];
$conditions = ['uid' => $uid, 'cid' => 0];
@ -883,48 +855,22 @@ class Event
$tformat = DI::l10n()->t('g:i A'); // 8:01 AM.
// Convert the time to different formats.
$dtstart_dt = DI::l10n()->getDay(
$item['event-adjust'] ?
DateTimeFormat::local($item['event-start'], $dformat)
: DateTimeFormat::utc($item['event-start'], $dformat)
);
$dtstart_title = DateTimeFormat::utc($item['event-start'], $item['event-adjust'] ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s');
$dtstart_dt = DI::l10n()->getDay(DateTimeFormat::local($item['event-start'], $dformat));
$dtstart_title = DateTimeFormat::utc($item['event-start'], DateTimeFormat::ATOM);
// Format: Jan till Dec.
$month_short = DI::l10n()->getDayShort(
$item['event-adjust'] ?
DateTimeFormat::local($item['event-start'], 'M')
: DateTimeFormat::utc($item['event-start'], 'M')
);
$month_short = DI::l10n()->getDayShort(DateTimeFormat::local($item['event-start'], 'M'));
// Format: 1 till 31.
$date_short = $item['event-adjust'] ?
DateTimeFormat::local($item['event-start'], 'j')
: DateTimeFormat::utc($item['event-start'], 'j');
$start_time = $item['event-adjust'] ?
DateTimeFormat::local($item['event-start'], $tformat)
: DateTimeFormat::utc($item['event-start'], $tformat);
$start_short = DI::l10n()->getDayShort(
$item['event-adjust'] ?
DateTimeFormat::local($item['event-start'], $dformat_short)
: DateTimeFormat::utc($item['event-start'], $dformat_short)
);
$date_short = DateTimeFormat::local($item['event-start'], 'j');
$start_time = DateTimeFormat::local($item['event-start'], $tformat);
$start_short = DI::l10n()->getDayShort(DateTimeFormat::local($item['event-start'], $dformat_short));
// If the option 'nofinisch' isn't set, we need to format the finish date/time.
if (!$item['event-nofinish']) {
$finish = true;
$dtend_dt = DI::l10n()->getDay(
$item['event-adjust'] ?
DateTimeFormat::local($item['event-finish'], $dformat)
: DateTimeFormat::utc($item['event-finish'], $dformat)
);
$dtend_title = DateTimeFormat::utc($item['event-finish'], $item['event-adjust'] ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s');
$end_short = DI::l10n()->getDayShort(
$item['event-adjust'] ?
DateTimeFormat::local($item['event-finish'], $dformat_short)
: DateTimeFormat::utc($item['event-finish'], $dformat_short)
);
$end_time = $item['event-adjust'] ?
DateTimeFormat::local($item['event-finish'], $tformat)
: DateTimeFormat::utc($item['event-finish'], $tformat);
$dtend_dt = DI::l10n()->getDay(DateTimeFormat::local($item['event-finish'], $dformat));
$dtend_title = DateTimeFormat::utc($item['event-finish'], DateTimeFormat::ATOM);
$end_short = DI::l10n()->getDayShort(DateTimeFormat::utc($item['event-finish'], $dformat_short));
$end_time = DateTimeFormat::local($item['event-finish'], $tformat);
// Check if start and finish time is at the same day.
if (substr($dtstart_title, 0, 10) === substr($dtend_title, 0, 10)) {
$same_date = true;
@ -1063,7 +1009,6 @@ class Event
'summary' => DI::l10n()->t('%s\'s birthday', $contact['name']),
'desc' => DI::l10n()->t('Happy Birthday %s', ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]'),
'type' => 'birthday',
'adjust' => 0
];
self::store($values);

View file

@ -88,7 +88,7 @@ class Item
'writable', 'self', 'cid', 'alias',
'event-created', 'event-edited', 'event-start', 'event-finish',
'event-summary', 'event-desc', 'event-location', 'event-type',
'event-nofinish', 'event-adjust', 'event-ignore', 'event-id',
'event-nofinish', 'event-ignore', 'event-id',
'delivery_queue_count', 'delivery_queue_done', 'delivery_queue_failed'
];
@ -103,7 +103,7 @@ class Item
'thr-parent-id', 'parent-uri-id', 'postopts', 'pubmail',
'event-created', 'event-edited', 'event-start', 'event-finish',
'event-summary', 'event-desc', 'event-location', 'event-type',
'event-nofinish', 'event-adjust', 'event-ignore', 'event-id'];
'event-nofinish', 'event-ignore', 'event-id'];
// All fields in the item table
const ITEM_FIELDLIST = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent',

View file

@ -555,7 +555,7 @@ class Profile
$rr['link'] = Contact::magicLinkById($rr['cid']);
$rr['title'] = $rr['name'];
$rr['date'] = DI::l10n()->getDay(DateTimeFormat::convert($rr['start'], $a->getTimeZone(), 'UTC', $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . DI::l10n()->t('[today]') : '');
$rr['date'] = DI::l10n()->getDay(DateTimeFormat::local($rr['start'], $bd_short)) . (($today) ? ' ' . DI::l10n()->t('[today]') : '');
$rr['startime'] = null;
$rr['today'] = $today;
}
@ -614,8 +614,8 @@ class Profile
$total++;
}
$strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC', 'UTC', 'Y-m-d');
if ($strt === DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) {
$strt = DateTimeFormat::local($rr['start'], 'Y-m-d');
if ($strt === DateTimeFormat::localNow('Y-m-d')) {
$istoday = true;
}
@ -630,17 +630,17 @@ class Profile
$description = DI::l10n()->t('[No description]');
}
$strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC');
$strt = DateTimeFormat::local($rr['start']);
if (substr($strt, 0, 10) < DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) {
if (substr($strt, 0, 10) < DateTimeFormat::localNow('Y-m-d')) {
continue;
}
$today = ((substr($strt, 0, 10) === DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) ? true : false);
$today = substr($strt, 0, 10) === DateTimeFormat::localNow('Y-m-d');
$rr['title'] = $title;
$rr['description'] = $description;
$rr['date'] = DI::l10n()->getDay(DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC', 'UTC', $bd_format)) . (($today) ? ' ' . DI::l10n()->t('[today]') : '');
$rr['date'] = DI::l10n()->getDay(DateTimeFormat::local($rr['start'], $bd_format)) . (($today) ? ' ' . DI::l10n()->t('[today]') : '');
$rr['startime'] = $strt;
$rr['today'] = $today;

View file

@ -61,7 +61,7 @@ class Index extends BaseApi
'type' => $event['type'],
'nofinish' => $event['nofinish'],
'place' => $event['location'],
'adjust' => $event['adjust'],
'adjust' => 1,
'ignore' => $event['ignore'],
'allow_cid' => $event['allow_cid'],
'allow_gid' => $event['allow_gid'],

View file

@ -372,10 +372,10 @@ class Network extends BaseModule
}
if (self::$dateFrom) {
$conditionStrings = DBA::mergeConditions($conditionStrings, ["`received` <= ? ", DateTimeFormat::convert(self::$dateFrom, 'UTC', date_default_timezone_get())]);
$conditionStrings = DBA::mergeConditions($conditionStrings, ["`received` <= ? ", DateTimeFormat::convert(self::$dateFrom, 'UTC', DI::app()->getTimeZone())]);
}
if (self::$dateTo) {
$conditionStrings = DBA::mergeConditions($conditionStrings, ["`received` >= ? ", DateTimeFormat::convert(self::$dateTo, 'UTC', date_default_timezone_get())]);
$conditionStrings = DBA::mergeConditions($conditionStrings, ["`received` >= ? ", DateTimeFormat::convert(self::$dateTo, 'UTC', DI::app()->getTimeZone())]);
}
if (self::$groupId) {

104
src/Module/Events/Json.php Normal file
View file

@ -0,0 +1,104 @@
<?php
namespace Friendica\Module\Events;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Event;
use Friendica\Model\Item;
use Friendica\Model\Post;
use Friendica\Network\HTTPException;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Temporal;
class Json extends \Friendica\BaseModule
{
public static function rawContent(array $parameters = [])
{
if (!local_user()) {
throw new HTTPException\UnauthorizedException();
}
$y = intval(DateTimeFormat::localNow('Y'));
$m = intval(DateTimeFormat::localNow('m'));
// Put some limit on dates. The PHP date functions don't seem to do so well before 1900.
if ($y < 1901) {
$y = 1900;
}
$dim = Temporal::getDaysInMonth($y, $m);
$start = sprintf('%d-%d-%d %d:%d:%d', $y, $m, 1, 0, 0, 0);
$finish = sprintf('%d-%d-%d %d:%d:%d', $y, $m, $dim, 23, 59, 59);
if (!empty($_GET['start'])) {
$start = $_GET['start'];
}
if (!empty($_GET['end'])) {
$finish = $_GET['end'];
}
// put the event parametes in an array so we can better transmit them
$event_params = [
'event_id' => intval($_GET['id'] ?? 0),
'start' => $start,
'finish' => $finish,
'ignore' => 0,
];
// get events by id or by date
if ($event_params['event_id']) {
$r = Event::getListById(local_user(), $event_params['event_id']);
} else {
$r = Event::getListByDate(local_user(), $event_params);
}
$links = [];
if (DBA::isResult($r)) {
$r = Event::sortByDate($r);
foreach ($r as $rr) {
$j = DateTimeFormat::utc($rr['start'], 'j');
if (empty($links[$j])) {
$links[$j] = DI::baseUrl() . '/' . DI::args()->getCommand() . '#link-' . $j;
}
}
}
$events = [];
// transform the event in a usable array
if (DBA::isResult($r)) {
$events = Event::sortByDate($r);
$events = self::map($events);
}
header('Content-Type: application/json');
echo json_encode($events);
exit();
}
private static function map(array $events): array
{
return array_map(function ($event) {
$item = Post::selectFirst(['plink', 'author-name', 'author-avatar', 'author-link', 'private', 'uri-id'], ['id' => $event['itemid']]);
if (!DBA::isResult($item)) {
// Using default values when no item had been found
$item = ['plink' => '', 'author-name' => '', 'author-avatar' => '', 'author-link' => '', 'private' => Item::PUBLIC, 'uri-id' => ($event['uri-id'] ?? 0)];
}
return [
'id' => $event['id'],
'title' => $event['summary'],
'start' => DateTimeFormat::local($event['start']),
'end' => DateTimeFormat::local($event['finish']),
'nofinish' => $event['nofinish'],
'desc' => $event['desc'],
'location' => $event['location'],
'item' => $item,
];
}, $events);
}
}

View file

@ -151,10 +151,10 @@ class Status extends BaseProfile
}
if (!empty($datequery)) {
$condition = DBA::mergeConditions($condition, ["`received` <= ?", DateTimeFormat::convert($datequery, 'UTC', date_default_timezone_get())]);
$condition = DBA::mergeConditions($condition, ["`received` <= ?", DateTimeFormat::convert($datequery, 'UTC', $a->getTimeZone())]);
}
if (!empty($datequery2)) {
$condition = DBA::mergeConditions($condition, ["`received` >= ?", DateTimeFormat::convert($datequery2, 'UTC', date_default_timezone_get())]);
$condition = DBA::mergeConditions($condition, ["`received` >= ?", DateTimeFormat::convert($datequery2, 'UTC', $a->getTimeZone())]);
}
// Does the profile page belong to a forum?

View file

@ -408,7 +408,6 @@ class Processor
$event['finish'] = $activity['end-time'];
$event['nofinish'] = empty($event['finish']);
$event['location'] = $activity['location'];
$event['adjust'] = $activity['adjust'] ?? true;
$event['cid'] = $item['contact-id'];
$event['uid'] = $item['uid'];
$event['uri'] = $item['uri'];

View file

@ -1389,7 +1389,6 @@ class Receiver
$object_data = self::getSource($object, $object_data);
$object_data['start-time'] = JsonLD::fetchElement($object, 'as:startTime', '@value');
$object_data['end-time'] = JsonLD::fetchElement($object, 'as:endTime', '@value');
$object_data['adjust'] = JsonLD::fetchElement($object, 'dfrn:adjust', '@value');
$object_data['location'] = $location;
$object_data['latitude'] = JsonLD::fetchElement($object, 'as:location', 'as:latitude', '@type', 'as:Place');
$object_data['latitude'] = JsonLD::fetchElement($object_data, 'latitude', '@value');

View file

@ -1476,10 +1476,10 @@ class Transmitter
$event = [];
$event['name'] = $item['event-summary'];
$event['content'] = BBCode::convertForUriId($item['uri-id'], $item['event-desc'], BBCode::ACTIVITYPUB);
$event['startTime'] = DateTimeFormat::utc($item['event-start'] . '+00:00', DateTimeFormat::ATOM);
$event['startTime'] = DateTimeFormat::utc($item['event-start'], 'c');
if (!$item['event-nofinish']) {
$event['endTime'] = DateTimeFormat::utc($item['event-finish'] . '+00:00', DateTimeFormat::ATOM);
$event['endTime'] = DateTimeFormat::utc($item['event-finish'], 'c');
}
if (!empty($item['event-location'])) {
@ -1487,7 +1487,8 @@ class Transmitter
$event['location'] = self::createLocation($item);
}
$event['dfrn:adjust'] = (bool)$item['event-adjust'];
// 2021.12: Backward compatibility value, all the events now "adjust" to the viewer timezone
$event['dfrn:adjust'] = true;
return $event;
}

View file

@ -488,10 +488,7 @@ class DFRN
XML::addElement($doc, $author, "poco:note", $profile["about"]);
XML::addElement($doc, $author, "poco:preferredUsername", $profile["nickname"]);
$savetz = date_default_timezone_get();
date_default_timezone_set($profile["timezone"]);
XML::addElement($doc, $author, "poco:utcOffset", date("P"));
date_default_timezone_set($savetz);
XML::addElement($doc, $author, "poco:utcOffset", DateTimeFormat::timezoneNow($profile["timezone"], "P"));
if (trim($profile["homepage"]) != "") {
$urls = $doc->createElement("poco:urls");

View file

@ -3314,15 +3314,12 @@ class Diaspora
$eventdata["all_day"] = "false";
$eventdata['timezone'] = 'UTC';
if (!$event['adjust'] && $owner['timezone']) {
$eventdata['timezone'] = $owner['timezone'];
}
if ($event['start']) {
$eventdata['start'] = DateTimeFormat::convert($event['start'], "UTC", $eventdata['timezone'], $mask);
$eventdata['start'] = DateTimeFormat::utc($event['start'], $mask);
}
if ($event['finish'] && !$event['nofinish']) {
$eventdata['end'] = DateTimeFormat::convert($event['finish'], "UTC", $eventdata['timezone'], $mask);
$eventdata['end'] = DateTimeFormat::utc($event['finish'], $mask);
}
if ($event['summary']) {
$eventdata['summary'] = html_entity_decode(BBCode::toMarkdown($event['summary']));

View file

@ -305,7 +305,6 @@ class Authentication
$this->session->set('new_member', time() < ($member_since + (60 * 60 * 24 * 14)));
if (strlen($user_record['timezone'])) {
date_default_timezone_set($user_record['timezone']);
$a->setTimeZone($user_record['timezone']);
}

View file

@ -36,6 +36,13 @@ class DateTimeFormat
const HTTP = 'D, d M Y H:i:s \G\M\T';
const JSON = 'Y-m-d\TH:i:s.v\Z';
static $localTimezone = 'UTC';
public static function setLocalTimeZone(string $timezone)
{
self::$localTimezone = $timezone;
}
/**
* convert() shorthand for UTC.
*
@ -59,7 +66,7 @@ class DateTimeFormat
*/
public static function local($time, $format = self::MYSQL)
{
return self::convert($time, date_default_timezone_get(), 'UTC', $format);
return self::convert($time, self::$localTimezone, 'UTC', $format);
}
/**
@ -160,7 +167,7 @@ class DateTimeFormat
$to_obj = new DateTimeZone('UTC');
}
$d->setTimeZone($to_obj);
$d->setTimezone($to_obj);
return $d->format($format);
}

View file

@ -271,7 +271,11 @@ class Temporal
$id,
$label,
$input_text,
'',
DI::l10n()->t(
'Time zone: <strong>%s</strong> <a href="%s">Change in Settings</a>',
str_replace('_', ' ', DI::app()->getTimeZone()) . ' (GMT ' . DateTimeFormat::localNow('P') . ')',
DI::baseUrl() . '/settings'
),
$required ? '*' : '',
'placeholder="' . $readable_format . '"'
],
@ -284,7 +288,7 @@ class Temporal
'lang' => $lang,
'minfrom' => $minfrom,
'maxfrom' => $maxfrom,
]
],
]);
return $o;
@ -360,23 +364,19 @@ class Temporal
* Returns the age in years, given a date of birth and the timezone of the person
* whose date of birth is provided.
*
* @param string $dob Date of Birth
* @param string $owner_tz (optional) Timezone of the person of interest
* @param string $dob Date of Birth
* @param string $timezone Timezone of the person of interest
*
* @return int Age in years
* @throws \Exception
*/
public static function getAgeByTimezone($dob, $owner_tz = ''): int
public static function getAgeByTimezone(string $dob, string $timezone): int
{
if (!intval($dob)) {
return 0;
}
if (!$owner_tz) {
$owner_tz = date_default_timezone_get();
}
$birthdate = new DateTime($dob . ' 00:00:00', new DateTimeZone($owner_tz));
$birthdate = new DateTime($dob . ' 00:00:00', new DateTimeZone($timezone));
$currentDate = new DateTime('now', new DateTimeZone('UTC'));
$interval = $birthdate->diff($currentDate);