Make WordPress Core

Ticket #34835: trac-34835.patch

File trac-34835.patch, 2.8 KB (added by Rarst, 6 years ago)

Patch with unit test.

  • src/wp-includes/functions.php

    From 55bc482d24c84d623732445405df534f6a0f941e Mon Sep 17 00:00:00 2001
    From: Andrey Savchenko <contact@rarst.net>
    Date: Thu, 28 Jun 2018 13:29:19 +0300
    Subject: [PATCH] Implemented gmt_offset support in date_i18n().
    
    ---
     src/wp-includes/functions.php         | 30 ++++++++++++++++++++++++++++++
     tests/phpunit/tests/date/dateI18n.php | 13 +++++++++++++
     2 files changed, 43 insertions(+)
    
    diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php
    index 3c4a301298..b4df760ec6 100644
    a b function date_i18n( $dateformatstring, $timestamp_with_offset = false, $gmt = fa 
    138138                                        $dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) - 1 );
    139139                                }
    140140                        }
     141                } else {
     142                        $offset = get_option( 'gmt_offset' );
     143                        foreach ( $timezone_formats as $timezone_format ) {
     144                                if ( 'I' === $timezone_format ) {
     145                                        continue;
     146                                }
     147
     148                                if ( false !== strpos( $dateformatstring, $timezone_format ) ) {
     149                                        if ( 'Z' === $timezone_format ) {
     150                                                $formatted = (string) ( $offset * HOUR_IN_SECONDS );
     151                                        } else {
     152                                                $prefix    = '';
     153                                                $hours     = (int) $offset;
     154                                                $separator = '';
     155                                                $minutes   = abs( ( $offset - $hours ) * 60 );
     156
     157                                                if ( 'T' === $timezone_format ) {
     158                                                        $prefix = 'GMT';
     159                                                } elseif ( 'e' === $timezone_format || 'P' === $timezone_format ) {
     160                                                        $separator = ':';
     161                                                }
     162
     163                                                $formatted = sprintf( '%s%+03d%s%02d', $prefix, $hours, $separator, $minutes );
     164                                        }
     165
     166                                        $dateformatstring = ' ' . $dateformatstring;
     167                                        $dateformatstring = preg_replace( "/([^\\\])$timezone_format/", "\\1" . backslashit( $formatted ), $dateformatstring );
     168                                        $dateformatstring = substr( $dateformatstring, 1 );
     169                                }
     170                        }
    141171                }
    142172        }
    143173        $j = @date( $dateformatstring, $i );
  • tests/phpunit/tests/date/dateI18n.php

    diff --git a/tests/phpunit/tests/date/dateI18n.php b/tests/phpunit/tests/date/dateI18n.php
    index e92f58de6f..91bf511245 100644
    a b public function test_adjusts_format_based_on_timezone_string() { 
    6767
    6868                $this->assertEquals( '2012-12-01 00:00:00 CST -06:00 America/Regina', date_i18n( 'Y-m-d H:i:s T P e', strtotime( '2012-12-01 00:00:00' ) ) );
    6969        }
     70
     71        public function test_gmt_offset_should_output_correct_timezone() {
     72                $timezone_formats = 'P I O T Z e';
     73                $timezone_string  = 'America/Regina';
     74                $datetimezone     = new DateTimeZone( $timezone_string );
     75                update_option( 'timezone_string', '' );
     76                $offset = $datetimezone->getOffset( new DateTime() ) / 3600;
     77                update_option( 'gmt_offset', $offset );
     78                $datetime = new DateTime( 'now', $datetimezone );
     79                $datetime = new DateTime( $datetime->format( 'P' ) );
     80
     81                $this->assertEquals( $datetime->format( $timezone_formats ), date_i18n( $timezone_formats ) );
     82        }
    7083}