summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/LocalTime.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/LocalTime.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/LocalTime.php104
1 files changed, 104 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/LocalTime.php b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/LocalTime.php
new file mode 100644
index 00000000..86070a80
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/LocalTime.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace SMW\MediaWiki;
+
+use DateInterval;
+use DateTime;
+use DateTimeZone;
+use User;
+
+/**
+ * @license GNU GPL v2+
+ * @since 3.0
+ *
+ * @author mwjames
+ */
+class LocalTime {
+
+ /**
+ * @see $GLOBALS['wgLocalTZoffset']
+ * @var integer
+ */
+ private static $localTimeOffset = 0;
+
+ /**
+ * @since 3.0
+ *
+ * @param integer $localTimeOffset
+ */
+ public static function setLocalTimeOffset( $localTimeOffset ) {
+ self::$localTimeOffset = $localTimeOffset;
+ }
+
+ /**
+ * @see Language::userAdjust
+ *
+ * Language::userAdjust cannot be used as entirely relies on the timestamp
+ * premises making < 1970 return invalid results hence we copy the relevant
+ * part on work with the DateInterval instead.
+ *
+ * @since 3.0
+ *
+ * @param DateTime $dateTime
+ * @param User|null $user
+ *
+ * @return DateTime
+ */
+ public static function getLocalizedTime( DateTime $dateTime, User $user = null ) {
+
+ $tz = $user instanceof User ? $user->getOption( 'timecorrection' ) : false;
+ $data = explode( '|', $tz, 3 );
+
+ // DateTime is mutable, keep track of possible changes
+ $dateTime->hasLocalTimeCorrection = false;
+
+ if ( $data[0] == 'ZoneInfo' ) {
+ try {
+ $userTZ = new DateTimeZone( $data[2] );
+ $dateTime->setTimezone( $userTZ );
+ $dateTime->hasLocalTimeCorrection = true;
+ return $dateTime;
+ } catch ( \Exception $e ) {
+ // Unrecognized timezone, default to 'Offset' with the stored offset.
+ $data[0] = 'Offset';
+ }
+ }
+
+ if ( $data[0] == 'System' || $tz == '' ) {
+ # Global offset in minutes.
+ $minDiff = self::$localTimeOffset;
+ } elseif ( $data[0] == 'Offset' ) {
+ $minDiff = intval( $data[1] );
+ } else {
+ $data = explode( ':', $tz );
+ if ( count( $data ) == 2 ) {
+ $data[0] = intval( $data[0] );
+ $data[1] = intval( $data[1] );
+ $minDiff = abs( $data[0] ) * 60 + $data[1];
+ if ( $data[0] < 0 ) {
+ $minDiff = -$minDiff;
+ }
+ } else {
+ $minDiff = intval( $data[0] ) * 60;
+ }
+ }
+
+ # No difference ?
+ if ( 0 == $minDiff ) {
+ return $dateTime;
+ }
+
+ $dateInterval = new DateInterval( "PT" . abs( $minDiff ) . "M" );
+
+ if ( $minDiff > 0 ) {
+ $dateTime->add( $dateInterval );
+ } else {
+ $dateTime->sub( $dateInterval );
+ }
+
+ $dateTime->hasLocalTimeCorrection = true;
+
+ return $dateTime;
+ }
+
+}