Home > Enterprise >  Which date format is this?
Which date format is this?

Time:10-01

I want to convert this date-time string 2022-09-30T21:39:25.220185674Z to yyyy-mm-dd hh:mm:ss but it returns 1970-01-01 01:00:00 everytime.

Tried with: date('Y-m-d H:i:s', strtotime('2022-09-30T21:39:25.220185674Z')); or date('Y-m-d\TH:i:s', strtotime('2022-09-30T21:39:25.220185674Z'));

Can you help find out which format this is and how i could corretly format such string in PHP?

Went through this question or this one couldn't help.

CodePudding user response:

It's a ISO 8601 datetime string with microseconds, where Z is the timezone "Zulu" or UTC 0 hours.

ISO 8601 can be parsed with DateTime() like this:

$string = '2022-09-30T21:39:25.220185Z';
  //create DateTime object
$date   = date_create_from_format( "Y-m-d\TH:i:s.uP" , $string);
echo $date->format( 'Y-m-d H:i:s.u' );

However This will not work with your string, as the u parameter in the format "Y-m-d\TH:i:s.uP" which represents the microseconds, in PHP takes a maximum of 6 digits, and yours has 9.

You can resolve this by removing all above 6 digits from the microseconds part of the string with a regex, like

$string = '2022-09-30T21:39:25.220185674Z';
$new_string = preg_replace( '/^.*?\.\d{0,6}\K\d*/' , '' , $string );
$date   = date_create_from_format( "Y-m-d\TH:i:s.uP" , $new_string );
echo $date->format('Y-m-d H:i:s.u');

Output: 2022-09-30 21:39:25.220180

The regex explained:

1. ^.*?\.\d{0,6} // select from the begin everything including the dot
                 // and max 6 digits
2. \K            // forget the previous match and start again from the 
                 // point where 1. ended
3. \d*           // select all digits left
4. replace the match with "" 

CodePudding user response:

As of PHP version 8.0.10, strings like '2022-09-30T21:39:25.220185674Z' are recognized by DateTime without any problems.

$str = '2022-09-30T21:39:25.220185674Z';
$d = new DateTime($str);
var_dump($d);
/*
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2022-09-30 21:39:25.220185"
  ["timezone_type"]=>
  int(2)
  ["timezone"]=>
  string(1) "Z"
}
*/

https://3v4l.org/pI4kO

  • Related