john Smith
john Smith

Reputation: 17906

PHP DateTime, parsing string date fails

im passing a startDate end an endDate as a get request parameter to a method, here they get parsed like :

$startDate=$request->query->get('start');
$endDate=$request->query->get('end');
$logger->info('startdate is :'.$startDate.', endDate is : '.$endDate.'');

$start=new \DateTime($startDate);
$end=new \DateTime($endDate); 

when i log those two parameters, they may be

startdate is: Wed Jan 12 2011 00:00:00 GMT 0100 (CET)

startDate is: Sat Jan 12 2013 00:00:00 GMT 0100 (CET)

so far so good, but if i log the DateTime´s instanciated from the string above it returns

DateTime Object ( [date] => 0100-01-12 00:00:00 [timezone_type] => 2 [timezone] => GMT ) 

DateTime Object ( [date] => 0100-01-15 00:00:00 [timezone_type] => 2 [timezone] => GMT )

you can see, the DateTime does not represent the same Date

can i make a valid DateTime from those Strings ?

Update :

i tryed to use createFromFormat

like

    $startDate=$request->query->get('start');
    $endDate=$request->query->get('end');

    $start=new \DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$startDate);
    $end=new \DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$endDate);   

but that causes exception :

FatalErrorException: Parse: syntax error, unexpected 'createFromFormat' (T_STRING), expecting variable (T_VARIABLE) or '$' in 

i also tryed :

    $start=new \DateTime(\DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$startDate));
    $end=new \DateTime(\DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$endDate));   

But that creates Dates a new Date from right now ( 2014-01-21 12:28:57 )

I just dont get it right.

for any help, thanks in advance!

Upvotes: 2

Views: 2845

Answers (2)

Glavić
Glavić

Reputation: 43552

Your input datetime string Wed Jan 12 2011 00:00:00 GMT 0100 (CET) is not valid/standard for use in DateTime() or strtotime(). See date_parse() function to see how your datetime string is being parsed:

print_r( date_parse('Wed Jan 12 2011 00:00:00 GMT 0100 (CET)') );

demo

Use DateTime::createFromFormat() static method to return DateTime object according to the specific format.

demo

Upvotes: 3

ToBe
ToBe

Reputation: 2681

The date format you are probably using is RFC2822. As shown on the PHP date() page as this: Thu, 21 Dec 2000 16:01:07 +0200

You switched the month and day parts and PHP was unable to determine the correct parts.

Best practice would be to either use a Unix-Timestamp (seconds after Epoch) or a better format like ISO 8601 (2004-02-12T15:19:21+00:00).

Upvotes: 1

Related Questions