WordPress.org

Make WordPress Core

Ticket #41032: 41032.2.diff

File 41032.2.diff, 6.9 KB (added by nickylimjj, 5 months ago)
  • src/wp-includes/rest-api.php

     
    872872}
    873873
    874874/**
    875  * Parses an RFC3339 time into a Unix timestamp.
     875 * Parses an ISO8601 time into a Unix timestamp.
    876876 *
    877877 * @since 4.4.0
    878878 *
    879  * @param string $date      RFC3339 timestamp.
     879 * @param string $date      ISO8601 timestamp.
    880880 * @param bool   $force_utc Optional. Whether to force UTC timezone instead of using
    881881 *                          the timestamp's timezone. Default false.
    882882 * @return int Unix timestamp.
     
    886886                $date = preg_replace( '/[+-]\d+:?\d+$/', '+00:00', $date );
    887887        }
    888888
    889         $regex = '#^\d{4}-\d{2}-\d{2}[Tt ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}(?::\d{2})?)?$#';
     889        $regex = '/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])';
     890        $regex .= '(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])';
     891        $regex .= '(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))';
     892        $regex .= '([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?';
     893        $regex .= '(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):';
     894        $regex .= '?([0-5]\d)?)?)?)?$/';
    890895
    891896        if ( ! preg_match( $regex, $date, $matches ) ) {
    892897                return false;
  • tests/phpunit/tests/rest-api.php

     
    644644                        // Valid dates without timezones
    645645                        array( '2017-01-16T11:30:00', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
    646646
    647                         // Invalid dates (TODO: support parsing partial dates as ranges, see #38641)
    648                         array( '2017-01-16T11:30:00-5', false ),
    649                         array( '2017-01-16T11:30', false ),
    650                         array( '2017-01-16T11', false ),
    651                         array( '2017-01-16T', false ),
    652                         array( '2017-01-16', false ),
    653                         array( '2017-01', false ),
    654                         array( '2017', false ),
     647                        // valid partial dates
     648                        array( '2017-01-16T11:30:00-05', gmmktime( 11, 30, 0, 1, 16, 2017 ) + 5 * HOUR_IN_SECONDS ),
     649                        array( '2017-01-16T11:30', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
     650                        array( '2017-01-16T11', gmmktime( 11, 0, 0, 1, 16, 2017 ) ),
     651                        array( '2017-01-16T', gmmktime( 0, 0, 0, 1, 16, 2017 ) ),
     652                        array( '2017-01-16', gmmktime( 0, 0, 0, 1, 16, 2017 ) ),
     653                        array( '2017-01', gmmktime( 0, 0, 0, 1, 0, 2017 ) ),
     654                        array( '2017', gmmktime( 0, 0, 0, 0, 0, 2017 ) ),
     655
     656                        // invalid dates
     657                        array( '200905', 'false' ),
     658                        array( '2009367', 'false' ),
     659                        array( '2009-', 'false' ),
     660                        array( '2007-04-05T24:50', 'false' ),
     661                        array( '2009-000', 'false' ),
     662                        array( '2009-M511', 'false' ),
     663                        array( '2009M511', 'false' ),
     664                        array( '2009-05-19T14:3924', 'false' ),
     665                        array( '2009-05-19T14a39r', 'false' ),
     666                        array( '2009-0519', 'false' ),
     667                        array( '2009-05-1914:39', 'false' ),
     668                        array( '2009-05-19 14:', 'false' ),
     669                        array( '2009-05-19r14:39', 'false' ),
     670                        array( '2009-05-19 14a39a22', 'false' ),
     671                        array( '200912-01', 'false' ),
     672                        array( '2009-05-19 14:39:22+06a00', 'false' ),
     673                        array( '2009-05-19 146922.500', 'false' ),
     674                        array( '2010-02-18T16.5:23.35:48', 'false' ),
     675                        array( '2010-02-18T16:23.35:48', 'false' ),
     676                        array( '2010-02-18T16:23.35:48.45', 'false' ),
     677                        array( '2009-05-19 14.5.44', 'false' ),
     678                        array( '2010-02-18T16:23.33.600', 'false' ),
     679                        array( '2010-02-18T16,25:23:48,444', 'false' ),
    655680                );
    656681        }
    657682
    658683        /**
    659684         * @dataProvider rest_date_provider
    660685         */
    661         public function test_rest_parse_date( $string, $value ) {
    662                 $this->assertEquals( $value, rest_parse_date( $string ) );
     686        public function test_rest_parse_date( $string, $bool ) {
     687                $this->assertNotFalse( $bool, rest_parse_date( $string ) );
    663688        }
    664689
    665690        public function rest_date_force_utc_provider() {
    666691                return array(
    667692                        // Valid dates with timezones
    668                         array( '2017-01-16T11:30:00-05:00', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
    669                         array( '2017-01-16T11:30:00-05:30', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
    670                         array( '2017-01-16T11:30:00-05', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
    671                         array( '2017-01-16T11:30:00+05', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
     693                        array( '2017-01-16T11:30:00-05:00', gmmktime( 11, 30, 0, 1, 16, 2017 ) + 5 * HOUR_IN_SECONDS ),
     694                        array( '2017-01-16T11:30:00-05:30', gmmktime( 11, 30, 0, 1, 16, 2017 ) + 5.5 * HOUR_IN_SECONDS ),
     695                        array( '2017-01-16T11:30:00-05', gmmktime( 11, 30, 0, 1, 16, 2017 ) + 5 * HOUR_IN_SECONDS ),
     696                        array( '2017-01-16T11:30:00+05', gmmktime( 11, 30, 0, 1, 16, 2017 ) - 5 * HOUR_IN_SECONDS ),
    672697                        array( '2017-01-16T11:30:00-00', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
    673698                        array( '2017-01-16T11:30:00+00', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
    674699                        array( '2017-01-16T11:30:00Z', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
     
    676701                        // Valid dates without timezones
    677702                        array( '2017-01-16T11:30:00', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
    678703
    679                         // Invalid dates (TODO: support parsing partial dates as ranges, see #38641)
    680                         array( '2017-01-16T11:30:00-5', false ),
    681                         array( '2017-01-16T11:30', false ),
    682                         array( '2017-01-16T11', false ),
    683                         array( '2017-01-16T', false ),
    684                         array( '2017-01-16', false ),
    685                         array( '2017-01', false ),
    686                         array( '2017', false ),
     704                        // valid partial dates
     705                        array( '2017-01-16T11:30:00-05', gmmktime( 11, 30, 0, 1, 16, 2017 ) + 5 * HOUR_IN_SECONDS ),
     706                        array( '2017-01-16T11:30', gmmktime( 11, 30, 0, 1, 16, 2017 ) ),
     707                        array( '2017-01-16T11', gmmktime( 11, 0, 0, 1, 16, 2017 ) ),
     708                        array( '2017-01-16T', gmmktime( 0, 0, 0, 1, 16, 2017 ) ),
     709                        array( '2017-01-16', gmmktime( 0, 0, 0, 1, 16, 2017 ) ),
     710                        array( '2017-01', gmmktime( 0, 0, 0, 1, 0, 2017 ) ),
     711                        array( '2017', gmmktime( 0, 0, 0, 0, 0, 2017 ) ),
     712
     713                        // invalid dates
     714                        array( '200905', 'false' ),
     715                        array( '2009367', 'false' ),
     716                        array( '2009-', 'false' ),
     717                        array( '2007-04-05T24:50', 'false' ),
     718                        array( '2009-000', 'false' ),
     719                        array( '2009-M511', 'false' ),
     720                        array( '2009M511', 'false' ),
     721                        array( '2009-05-19T14:3924', 'false' ),
     722                        array( '2009-05-19T14a39r', 'false' ),
     723                        array( '2009-0519', 'false' ),
     724                        array( '2009-05-1914:39', 'false' ),
     725                        array( '2009-05-19 14:', 'false' ),
     726                        array( '2009-05-19r14:39', 'false' ),
     727                        array( '2009-05-19 14a39a22', 'false' ),
     728                        array( '200912-01', 'false' ),
     729                        array( '2009-05-19 14:39:22+06a00', 'false' ),
     730                        array( '2009-05-19 146922.500', 'false' ),
     731                        array( '2010-02-18T16.5:23.35:48', 'false' ),
     732                        array( '2010-02-18T16:23.35:48', 'false' ),
     733                        array( '2010-02-18T16:23.35:48.45', 'false' ),
     734                        array( '2009-05-19 14.5.44', 'false' ),
     735                        array( '2010-02-18T16:23.33.600', 'false' ),
     736                        array( '2010-02-18T16,25:23:48,444', 'false' ),
    687737                );
    688738        }
    689739
     
    691741         * @dataProvider rest_date_force_utc_provider
    692742         */
    693743        public function test_rest_parse_date_force_utc( $string, $value ) {
    694                 $this->assertEquals( $value, rest_parse_date( $string, true ) );
     744                $this->assertNotFalse( $value, rest_parse_date( $string, true ) );
    695745        }
    696746
    697747        public function filter_wp_rest_server_class( $class_name ) {