Umherirrender has uploaded a new change for review. https://gerrit.wikimedia.org/r/71121
Change subject: Added wf[Local]DateTime to create DateTime objects ...................................................................... Added wf[Local]DateTime to create DateTime objects This avoids use of date(), which needs the local time zone corretly set on the server, which is assumed at the moment in Setup.php Change-Id: I812aa013be2f4380e0cf10dc465202756fe8347b --- M includes/GlobalFunctions.php M includes/Pager.php M includes/Preferences.php M includes/UserMailer.php M includes/Xml.php M includes/actions/HistoryAction.php M includes/db/DatabaseOracle.php M includes/filerepo/FileRepo.php M includes/parser/Parser.php M includes/specials/SpecialContributions.php M includes/specials/SpecialVersion.php A tests/phpunit/includes/GlobalFunctions/wfDateTimeTest.php 12 files changed, 105 insertions(+), 47 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/21/71121/1 diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index a44e45b..79f8e1f 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -2413,6 +2413,44 @@ } /** + * Get a DateTime object with the local timezone + * + * @param $ts int: unix timestamp, default 0 for the current time + * @return Mixed: DateTime / false A DateTime object or false + */ +function wfLocalDateTime( $ts = 0 ) { + global $wgLocaltimezone; + + try { + $localDateTime = new DateTime( null, new DateTimeZone( $wgLocaltimezone ) ); + $localDateTime->setTimestamp( $ts ); + return $localDateTime; + } catch ( Exception $e ) { + wfDebug( "wfLocalDateTime() fed bogus time value: " . + "VALUE=" . $ts . "; MESSAGE=" . $e->getMessage() . "\n" ); + return false; + } +} + +/** + * Get a DateTime object in UTC + * + * @param $ts int: unix timestamp, default 0 for the current time + * @return Mixed: DateTime / false A DateTime object or false + */ +function wfDateTime( $ts = 0 ) { + try { + $dateTime = new DateTime( null, new DateTimeZone( 'UTC' ) ); + $dateTime->setTimestamp( $ts ); + return $dateTime; + } catch ( Exception $e ) { + wfDebug( "wfDateTime() fed bogus time value: " . + "VALUE=" . $ts . "; MESSAGE=" . $e->getMessage() . "\n" ); + return false; + } +} + +/** * Check if the operating system is Windows * * @return Bool: true if it's Windows, False otherwise. diff --git a/includes/Pager.php b/includes/Pager.php index c2bd364..8fa20d0 100644 --- a/includes/Pager.php +++ b/includes/Pager.php @@ -872,9 +872,10 @@ $year = $this->mYear; } else { // If no year given, assume the current one - $year = gmdate( 'Y' ); + $dateTime = wfDateTime(); + $year = $dateTime->format( 'Y' ); // If this month hasn't happened yet this year, go back to last year's month - if ( $this->mMonth > gmdate( 'n' ) ) { + if ( $this->mMonth > $dateTime->format( 'n' ) ) { $year--; } } diff --git a/includes/Preferences.php b/includes/Preferences.php index 848cd32..5481042 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -635,7 +635,7 @@ # Timezone offset can vary with DST $userTZ = timezone_open( $tz[2] ); if ( $userTZ !== false ) { - $minDiff = floor( timezone_offset_get( $userTZ, date_create( 'now' ) ) / 60 ); + $minDiff = floor( timezone_offset_get( $userTZ, wfLocalDateTime() ) / 60 ); $tzSetting = "ZoneInfo|$minDiff|{$tz[2]}"; } } @@ -1275,10 +1275,11 @@ static function getTimezoneOptions( IContextSource $context ) { $opt = array(); - global $wgLocalTZoffset, $wgLocaltimezone; - // Check that $wgLocalTZoffset is the same as $wgLocaltimezone - if ( $wgLocalTZoffset == date( 'Z' ) / 60 ) { - $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $wgLocaltimezone )->text(); + global $wgLocalTZoffset; + $localDateTime = wfLocalDateTime(); + // Check that $wgLocalTZoffset is the same as the local time zone offset + if ( $wgLocalTZoffset == $localDateTime->format( 'Z' ) / 60 ) { + $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $localDateTime->getTimezone()->getName() )->text(); } else { $tzstring = sprintf( '%+03d:%02d', floor( $wgLocalTZoffset / 60 ), abs( $wgLocalTZoffset ) % 60 ); $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $tzstring )->text(); @@ -1308,8 +1309,6 @@ $prefill = array_fill_keys( array_values( $tzRegions ), array() ); $opt = array_merge( $opt, $prefill ); - $now = date_create( 'now' ); - foreach ( $tzs as $tz ) { $z = explode( '/', $tz, 2 ); @@ -1323,7 +1322,7 @@ # Localize region $z[0] = $tzRegions[$z[0]]; - $minDiff = floor( timezone_offset_get( timezone_open( $tz ), $now ) / 60 ); + $minDiff = floor( timezone_offset_get( timezone_open( $tz ), $localDateTime ) / 60 ); $display = str_replace( '_', ' ', $z[0] . '/' . $z[1] ); $value = "ZoneInfo|$minDiff|$tz"; diff --git a/includes/UserMailer.php b/includes/UserMailer.php index 2a549ac..54ef41f 100644 --- a/includes/UserMailer.php +++ b/includes/UserMailer.php @@ -241,7 +241,7 @@ $headers['Reply-To'] = $replyto->toString(); } - $headers['Date'] = date( 'r' ); + $headers['Date'] = wfLocalDateTime()->format( 'r' ); $headers['Message-ID'] = self::makeMsgId(); $headers['X-Mailer'] = 'MediaWiki mailer'; diff --git a/includes/Xml.php b/includes/Xml.php index 223061a..11e5f4c 100644 --- a/includes/Xml.php +++ b/includes/Xml.php @@ -195,8 +195,9 @@ if ( $year ) { $encYear = intval( $year ); } elseif ( $encMonth ) { - $thisMonth = intval( gmdate( 'n' ) ); - $thisYear = intval( gmdate( 'Y' ) ); + $dateTime = wfDateTime(); + $thisMonth = intval( $dateTime->format( 'n' ) ); + $thisYear = intval( $dateTime->format( 'Y' ) ); if ( intval( $encMonth ) > $thisMonth ) { $thisYear--; } diff --git a/includes/actions/HistoryAction.php b/includes/actions/HistoryAction.php index f43736b..964f51d 100644 --- a/includes/actions/HistoryAction.php +++ b/includes/actions/HistoryAction.php @@ -178,7 +178,7 @@ ) . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" . Html::hidden( 'action', 'history' ) . "\n" . - Xml::dateMenu( ( $year == null ? date( "Y" ) : $year ), $month ) . ' ' . + Xml::dateMenu( ( $year == null ? wfLocalDateTime()->format( 'Y' ) : $year ), $month ) . ' ' . ( $tagSelector ? ( implode( ' ', $tagSelector ) . ' ' ) : '' ) . $checkDeleted . Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" . diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index c0d3805..f40d88c 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -341,7 +341,7 @@ $union_unique = ( preg_match( '/\/\* UNION_UNIQUE \*\/ /', $sql ) != 0 ); // EXPLAIN syntax in Oracle is EXPLAIN PLAN FOR and it return nothing // you have to select data from plan table after explain - $explain_id = date( 'dmYHis' ); + $explain_id = wfLocalDateTime()->format( 'dmYHis' ); $sql = preg_replace( '/^EXPLAIN /', 'EXPLAIN PLAN SET STATEMENT_ID = \'' . $explain_id . '\' FOR', $sql, 1, $explain_count ); diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php index b82a0b8..e63c246 100644 --- a/includes/filerepo/FileRepo.php +++ b/includes/filerepo/FileRepo.php @@ -965,7 +965,7 @@ public function storeTemp( $originalName, $srcPath ) { $this->assertWritableRepo(); // fail out if read-only - $date = gmdate( "YmdHis" ); + $date = wfDateTime()->format( 'YmdHis' ); $hashPath = $this->getHashPath( $originalName ); $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName ); $virtualUrl = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel; diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 1c69208..abbbb9c 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -2685,46 +2685,46 @@ switch ( $index ) { case 'currentmonth': - $value = $pageLang->formatNum( gmdate( 'm', $ts ) ); + $value = $pageLang->formatNum( wfDateTime( $ts )->format( 'm' ) ); break; case 'currentmonth1': - $value = $pageLang->formatNum( gmdate( 'n', $ts ) ); + $value = $pageLang->formatNum( wfDateTime( $ts )->format( 'n' ) ); break; case 'currentmonthname': - $value = $pageLang->getMonthName( gmdate( 'n', $ts ) ); + $value = $pageLang->getMonthName( wfDateTime( $ts )->format( 'n' ) ); break; case 'currentmonthnamegen': - $value = $pageLang->getMonthNameGen( gmdate( 'n', $ts ) ); + $value = $pageLang->getMonthNameGen( wfDateTime( $ts )->format( 'n' ) ); break; case 'currentmonthabbrev': - $value = $pageLang->getMonthAbbreviation( gmdate( 'n', $ts ) ); + $value = $pageLang->getMonthAbbreviation( wfDateTime( $ts )->format( 'n' ) ); break; case 'currentday': - $value = $pageLang->formatNum( gmdate( 'j', $ts ) ); + $value = $pageLang->formatNum( wfDateTime( $ts )->format( 'j' ) ); break; case 'currentday2': - $value = $pageLang->formatNum( gmdate( 'd', $ts ) ); + $value = $pageLang->formatNum( wfDateTime( $ts )->format( 'd' ) ); break; case 'localmonth': - $value = $pageLang->formatNum( date( 'm', $ts ) ); + $value = $pageLang->formatNum( wfLocalDateTime( $ts )->format( 'm' ) ); break; case 'localmonth1': - $value = $pageLang->formatNum( date( 'n', $ts ) ); + $value = $pageLang->formatNum( wfLocalDateTime( $ts )->format( 'n' ) ); break; case 'localmonthname': - $value = $pageLang->getMonthName( date( 'n', $ts ) ); + $value = $pageLang->getMonthName( wfLocalDateTime( $ts )->format( 'n' ) ); break; case 'localmonthnamegen': - $value = $pageLang->getMonthNameGen( date( 'n', $ts ) ); + $value = $pageLang->getMonthNameGen( wfLocalDateTime( $ts )->format( 'n' ) ); break; case 'localmonthabbrev': - $value = $pageLang->getMonthAbbreviation( date( 'n', $ts ) ); + $value = $pageLang->getMonthAbbreviation( wfLocalDateTime( $ts )->format( 'n' ) ); break; case 'localday': - $value = $pageLang->formatNum( date( 'j', $ts ) ); + $value = $pageLang->formatNum( wfLocalDateTime( $ts )->format( 'j' ) ); break; case 'localday2': - $value = $pageLang->formatNum( date( 'd', $ts ) ); + $value = $pageLang->formatNum( wfLocalDateTime( $ts )->format( 'd' ) ); break; case 'pagename': $value = wfEscapeWikiText( $this->mTitle->getText() ); @@ -2870,44 +2870,44 @@ $value = ( wfUrlencode( $this->mTitle->getSubjectNsText() ) ); break; case 'currentdayname': - $value = $pageLang->getWeekdayName( gmdate( 'w', $ts ) + 1 ); + $value = $pageLang->getWeekdayName( wfDateTime( $ts )->format( 'w' ) + 1 ); break; case 'currentyear': - $value = $pageLang->formatNum( gmdate( 'Y', $ts ), true ); + $value = $pageLang->formatNum( wfDateTime( $ts )->format( 'Y' ), true ); break; case 'currenttime': $value = $pageLang->time( wfTimestamp( TS_MW, $ts ), false, false ); break; case 'currenthour': - $value = $pageLang->formatNum( gmdate( 'H', $ts ), true ); + $value = $pageLang->formatNum( wfDateTime( $ts )->format( 'H' ), true ); break; case 'currentweek': # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to # int to remove the padding - $value = $pageLang->formatNum( (int)gmdate( 'W', $ts ) ); + $value = $pageLang->formatNum( (int)wfDateTime( $ts )->format( 'W' ) ); break; case 'currentdow': - $value = $pageLang->formatNum( gmdate( 'w', $ts ) ); + $value = $pageLang->formatNum( wfDateTime( $ts )->format( 'w' ) ); break; case 'localdayname': - $value = $pageLang->getWeekdayName( date( 'w', $ts ) + 1 ); + $value = $pageLang->getWeekdayName( wfLocalDateTime( $ts )->format( 'w' ) + 1 ); break; case 'localyear': - $value = $pageLang->formatNum( date( 'Y', $ts ), true ); + $value = $pageLang->formatNum( wfLocalDateTime( $ts )->format( 'Y' ), true ); break; case 'localtime': - $value = $pageLang->time( date( 'YmdHis', $ts ), false, false ); + $value = $pageLang->time( wfLocalDateTime( $ts )->format( 'YmdHis' ), false, false ); break; case 'localhour': - $value = $pageLang->formatNum( date( 'H', $ts ), true ); + $value = $pageLang->formatNum( wfLocalDateTime( $ts )->format( 'H' ), true ); break; case 'localweek': # @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to # int to remove the padding - $value = $pageLang->formatNum( (int)date( 'W', $ts ) ); + $value = $pageLang->formatNum( (int)wfLocalDateTime( $ts )->format( 'W' ) ); break; case 'localdow': - $value = $pageLang->formatNum( date( 'w', $ts ) ); + $value = $pageLang->formatNum( wfLocalDateTime( $ts )->format( 'w' ) ); break; case 'numberofarticles': $value = $pageLang->formatNum( SiteStats::articles() ); @@ -2938,7 +2938,7 @@ $value = wfTimestamp( TS_MW, $ts ); break; case 'localtimestamp': - $value = date( 'YmdHis', $ts ); + $value = wfLocalDateTime( $ts )->format( 'YmdHis' ); break; case 'currentversion': $value = SpecialVersion::getVersion(); @@ -4524,10 +4524,11 @@ # (see also bug 12815) $ts = $this->mOptions->getTimestamp(); $unixts = wfTimestamp( TS_UNIX, $ts ); - $ts = date( 'YmdHis', $unixts ); - $tzMsg = date( 'T', $unixts ); # might vary on DST changeover! + $localDateTime = wfLocalDateTime( $unixts ); + $ts = $localDateTime->format( 'YmdHis' ); + $tzMsg = $localDateTime->format( 'T' ); # might vary on DST changeover! - # Allow translation of timezones through wiki. date() can return + # Allow translation of timezones through wiki. format() can return # whatever crap the system uses, localised or not, so we cannot # ship premade translations. $key = 'timezone-' . strtolower( trim( $tzMsg ) ); diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index 2f37cb4..d9884c4 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -567,7 +567,7 @@ $dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ), Xml::dateMenu( - $this->opts['year'] === '' ? gmdate( 'Y' ) : $this->opts['year'], + $this->opts['year'] === '' ? wfDateTime()->format( 'Y' ) : $this->opts['year'], $this->opts['month'] ) . ' ' . Xml::submitButton( diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index c257dd4..506e9ad 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -129,7 +129,7 @@ 'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', $othersLink ); - return wfMessage( 'version-poweredby-credits', date( 'Y' ), + return wfMessage( 'version-poweredby-credits', wfLocalDateTime()->format( 'Y' ), $wgLang->listToText( $authorList ) )->text(); } diff --git a/tests/phpunit/includes/GlobalFunctions/wfDateTimeTest.php b/tests/phpunit/includes/GlobalFunctions/wfDateTimeTest.php new file mode 100644 index 0000000..7fa40ee --- /dev/null +++ b/tests/phpunit/includes/GlobalFunctions/wfDateTimeTest.php @@ -0,0 +1,18 @@ +<?php +/* + * Tests for wfDateTime() and wfLocalDateTime(); + */ +class WfDateTimeTest extends MediaWikiTestCase { + + function testLocalTimezone() { + global $wgLocaltimezone; + $dateTime = wfLocalDateTime(); + $this->assertEquals( $wgLocaltimezone, $dateTime->getTimezone()->getName(), "wfLocalDateTime returns local time zone" ); + $this->assertEquals( date( 'T' ), $dateTime->getTimezone()->getName(), "wfLocalDateTime returns local time zone" ); + } + + function testUTCTimezone() { + $dateTime = wfDateTime(); + $this->assertEquals( 'UTC', $dateTime->getTimezone()->getName(), "wfDateTime returns UTC time zone" ); + } +} -- To view, visit https://gerrit.wikimedia.org/r/71121 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I812aa013be2f4380e0cf10dc465202756fe8347b Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Umherirrender <umherirrender_de...@web.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits