这是哪种日期格式



我想将此日期-时间字符串2022-09-30T21:39:25.220185674Z转换为yyyy-mm-dd hh:mm:ss,但它每次都返回1970-01-01 01:00:00。

尝试使用:date('Y-m-d H:i:s', strtotime('2022-09-30T21:39:25.220185674Z'));date('Y-m-dTH:i:s', strtotime('2022-09-30T21:39:25.220185674Z'));

你能帮我找出这是哪种格式,以及我如何在PHP中正确地格式化这样的字符串吗?

问了这个问题,或者这个问题帮不上忙。

这是一个以微秒为单位的ISO 8601日期时间字符串,其中Z是时区"祖鲁">或CCD_ 6。

ISO 8601可以用DateTime()解析如下:

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

但是这将不适用于您的字符串,因为在PHP中,格式为"Y-m-dTH:i:s.uP"(表示微秒(的u参数的最大值为6 digits,而您的参数为9

您可以通过使用regex(如(从字符串的微秒部分删除所有6位以上的数字来解决此问题

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

输出:2022-09-30 21:39:25.220180

正则表达式解释道:

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 "" 

带"?"在格式中,第6位之后的所有数字都可以被截断。

$string = '2022-09-30T21:39:25.220185123Z';
$date   = date_create_from_format( "Y-m-dTH:i:s.u???P" , $string);
var_dump($date);

https://3v4l.org/Upm6v

从PHP版本8.0.10开始,DateTime可以识别像"2022-09-30T21:35.220185674Z"这样的字符串,没有任何问题。

$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

相关内容

  • 没有找到相关文章

最新更新