我想将此日期-时间字符串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