From ea7e8314d2692f307e64f9deaaef511bf3bba61c Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Tue, 20 Oct 2015 06:07:45 +0000 Subject: [PATCH] Formatting: allow date strings to be passed to `get_gmt_from_date()`, instead of requiring `'Y-m-d H:i:s'`. Adds unit tests. Props pbearne. Fixes #34279. git-svn-id: https://develop.svn.wordpress.org/trunk@35284 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/formatting.php | 20 +++++++---- tests/phpunit/tests/formatting/date.php | 46 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php index ca5b75883a..be86adf95f 100644 --- a/src/wp-includes/formatting.php +++ b/src/wp-includes/formatting.php @@ -611,7 +611,7 @@ function get_html_split_regex() { . ')*+' // Loop possessively. . '(?:]]>)?'; // End of comment. If not found, match all input. - $escaped = + $escaped = '(?=' // Is the element escaped? . '!--' . '|' @@ -2587,13 +2587,19 @@ function get_gmt_from_date( $string, $format = 'Y-m-d H:i:s' ) { $tz = get_option( 'timezone_string' ); if ( $tz ) { $datetime = date_create( $string, new DateTimeZone( $tz ) ); - if ( ! $datetime ) + if ( ! $datetime ) { return gmdate( $format, 0 ); + } $datetime->setTimezone( new DateTimeZone( 'UTC' ) ); $string_gmt = $datetime->format( $format ); } else { - if ( ! preg_match( '#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $string, $matches ) ) - return gmdate( $format, 0 ); + if ( ! preg_match( '#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $string, $matches ) ) { + $datetime = strtotime( $string ); + if ( false === $datetime ) { + return gmdate( $format, 0 ); + } + return gmdate( $format, $datetime ); + } $string_time = gmmktime( $matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1] ); $string_gmt = gmdate( $format, $string_time - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ); } @@ -3876,10 +3882,10 @@ function sanitize_option( $option, $value ) { * * This is similar to `array_walk_recursive()` but acts upon objects too. * - * @since 4.4.0 - * + * @since 4.4.0 + * * @param mixed $value The array, object, or scalar. - * @param callable $function The function to map onto $value. + * @param callable $callback The function to map onto $value. * @return The value with the callback applied to all non-arrays and non-objects inside it. */ function map_deep( $value, $callback ) { diff --git a/tests/phpunit/tests/formatting/date.php b/tests/phpunit/tests/formatting/date.php index c2a3cc64a4..2d0fddcc36 100644 --- a/tests/phpunit/tests/formatting/date.php +++ b/tests/phpunit/tests/formatting/date.php @@ -47,4 +47,50 @@ class Tests_Formatting_Date extends WP_UnitTestCase { $gmt = '2012-06-01 11:34:56'; $this->assertEquals( $gmt, get_gmt_from_date( $local ) ); } + + /** + * @ticket 34279 + */ + function test_get_date_and_time_from_gmt_no_timezone() { + $gmt = $local = '2012-01-01 12:34:56'; + $this->assertEquals( $gmt, get_date_from_gmt( $local ) ); + } + + /** + * @ticket 34279 + */ + function test_get_gmt_from_date_no_timezone() { + $gmt = '2012-12-01 00:00:00'; + $date = '2012-12-01'; + $this->assertEquals( $gmt, get_gmt_from_date( $date ) ); + } + + /** + * @ticket 34279 + */ + function test_get_gmt_from_date_short_date() { + update_option( 'timezone_string', 'Europe/London' ); + $local = '2012-12-01'; + $gmt = '2012-12-01 00:00:00'; + $this->assertEquals( $gmt, get_gmt_from_date( $local ) ); + } + + /** + * @ticket 34279 + */ + function test_get_gmt_from_date_string_date() { + update_option( 'timezone_string', 'Europe/London' ); + $local = 'now'; + $gmt = gmdate( 'Y-m-d H:i:s', strtotime( 'now' ) ); + $this->assertEquals( $gmt, get_gmt_from_date( $local ) ); + } + + /** + * @ticket 34279 + */ + function test_get_gmt_from_date_string_date_no_timezone() { + $local = 'now'; + $gmt = gmdate( 'Y-m-d H:i:s', strtotime( 'now' ) ); + $this->assertEquals( $gmt, get_gmt_from_date( $local ) ); + } }