jenkins-bot has submitted this change and it was merged. Change subject: Fix formatting of TimeValues with month or day = '00' in timestamp ......................................................................
Fix formatting of TimeValues with month or day = '00' in timestamp These timestamps are considered valid, but there is an issue in the way DateTime handles them. In formatting, timestamps a DateTime object gets constructed in order to localise dates. DateTime mishandles such timestamps and we need to 'normalise' and adjust for this. Bug: 64659 Change-Id: I8c455b02508d23e5086eff4afb4672354c44f4ac (cherry picked from commit e977226133a8e1874627b6f7023b33b129822442) --- M lib/includes/formatters/MwTimeIsoFormatter.php M lib/tests/phpunit/formatters/MwTimeIsoFormatterTest.php 2 files changed, 42 insertions(+), 0 deletions(-) Approvals: Aude: Looks good to me, approved WikidataJenkins: Verified jenkins-bot: Verified diff --git a/lib/includes/formatters/MwTimeIsoFormatter.php b/lib/includes/formatters/MwTimeIsoFormatter.php index 8524943..43694ec 100644 --- a/lib/includes/formatters/MwTimeIsoFormatter.php +++ b/lib/includes/formatters/MwTimeIsoFormatter.php @@ -79,7 +79,12 @@ STR_PAD_LEFT ); + if ( $precision <= TimeValue::PRECISION_YEAR ) { + $fourDigitYearTimestamp = $this->normaliseMwTimestampInput( $fourDigitYearTimestamp ); + } + $timestamp = wfTimestamp( TS_MW, $fourDigitYearTimestamp ); + $localisedDate = $this->language->sprintfDate( $this->getDateFormat( $precision ), $timestamp @@ -104,6 +109,31 @@ } /** + * Normalize so that MWTimestamp, which does new DateTime( $timestamp ), + * can handle timestamp strings with '00' for month and/or '00' for day. + * We 'round' it to '01' and '01' for formatting purposes. + * + * Without this, '+00000001995-00-00T00:00:00Z' gets becomes '1994-11-30 00:00:00' + * in the DateTime object. Then '1994' != '1995' comparison in $this->canFormatYear() + * fails and a timestamp is returned on failure. (see bug: 64659) + * + * @param string $fourDigitYearTimestamp + * + * @return string + */ + private function normaliseMwTimestampInput( $fourDigitYearTimestamp ) { + if ( substr( $fourDigitYearTimestamp, 5, 2 ) === '00' ) { + $fourDigitYearTimestamp = substr_replace( $fourDigitYearTimestamp, '01', 5, 2 ); + } + + if ( substr( $fourDigitYearTimestamp, 8, 2 ) === '00' ) { + $fourDigitYearTimestamp = substr_replace( $fourDigitYearTimestamp, '01', 8, 2 ); + } + + return $fourDigitYearTimestamp; + } + + /** * @param string $date * * @return string diff --git a/lib/tests/phpunit/formatters/MwTimeIsoFormatterTest.php b/lib/tests/phpunit/formatters/MwTimeIsoFormatterTest.php index feb0913..69dacf9 100644 --- a/lib/tests/phpunit/formatters/MwTimeIsoFormatterTest.php +++ b/lib/tests/phpunit/formatters/MwTimeIsoFormatterTest.php @@ -72,6 +72,18 @@ '+00000002013-07-16T00:00:00Z', TimeValue::PRECISION_YEAR, ), + '1995' => array( + '+00000001995-00-00T00:00:00Z', + TimeValue::PRECISION_YEAR, + ), + '1996' => array( + '+00000001996-01-00T00:00:00Z', + TimeValue::PRECISION_YEAR, + ), + '1997' => array( + '+00000001997-00-01T00:00:00Z', + TimeValue::PRECISION_YEAR, + ), '13' => array( '+00000000013-07-16T00:00:00Z', TimeValue::PRECISION_YEAR, -- To view, visit https://gerrit.wikimedia.org/r/130827 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I8c455b02508d23e5086eff4afb4672354c44f4ac Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: mw1.24-wmf2 Gerrit-Owner: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Aude <aude.w...@gmail.com> Gerrit-Reviewer: WikidataJenkins <wikidata-servi...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits