我有一根绳子
$string = "2012-1-12 51:00:00.5";
如何在不使用日期函数的情况下将这个日期分解为年、月、日、小时、分钟、秒。
我正在尝试多次调用
explode()
,因为它一次只能拆分一个定界符,但这效果不佳。
我的尝试:
$string = "2012-1-12 51:00:00.5";
print_r(explode(" ", $date));
print_r(explode("-", $date));
print_r(explode(":", $date));
输出:
Array
(
[0] => Array
(
[0] => 2012-1-12
[1] => 51:00:00.5
)
[1] => Array
(
[0] => 2012
[1] => 1
[2] => 12 51:00:00.5
)
[2] => Array
(
[0] => 2012-1-12 51
[1] => 00
[2] => 00.5
)
)
您可以使用
preg_split
,因为您需要在 3 个参数上展开,这有效 -
$string="2012-1-12 51:00:00.5";
$pieces = preg_split("/[-: ]/", $string);
var_dump($pieces);
/*
array
0 => string '2012' (length=4)
1 => string '1' (length=1)
2 => string '12' (length=2)
3 => string '51' (length=2)
4 => string '00' (length=2)
5 => string '00.5' (length=4)
*/
如您查询的评论中所述,需要三个爆炸:
list($date, $time) = explode(" ", $string);
list($year, $month, $day) = explode("-", $date);
list($hours, $mins, $sec) = explode(":", $time);
/*print the values of $year, $date and so on*/
希望这有帮助。当然,假设您的应用程序中的所有日期时间值都采用上述格式,这将起作用。
使用
sscanf()
可能是将该日期时间字符串解析为其单独的数字组件的最可控方法。 preg_split()
可能是最简洁的。
“格式”参数中的占位符:
%d
表示整数(并且孤立的值将被转换为int类型值),%f
表示浮点值(并且隔离值将被转换为浮点类型值)。[^...]
就像一个否定字符类,它会贪婪地匹配一个或多个未在方括号表达式内列出的字符。代码:(演示)
整数和浮点数:
$string = "2012-1-12 51:00:00.5";
var_export(sscanf($string, '%d-%d-%d %d:%d:%d%f'));
// or if you want only integers:
// var_export(sscanf($string, '%d-%d-%d %d:%d:%d.%d'));
// or if you want seconds as a float:
// var_export(sscanf($string, '%d-%d-%d %d:%d:%f'));
// or if you want seconds as an integer
// var_export(sscanf($string, '%d-%d-%d %d:%d:%d'));
输出:
array (
0 => 2012,
1 => 1,
2 => 12,
3 => 51,
4 => 0,
5 => 0,
6 => 0.5,
)
保留零填充的字符串(并删除定界点)
var_export(sscanf($string, '%[^-]-%[^-]-%[^ ] %[^:]:%[^:]:%[^.].%s'));
// or truncate the decimal value
// var_export(sscanf($string, '%[^-]-%[^-]-%[^ ] %[^:]:%[^:]:%[^.]'));
输出:
array (
0 => '2012',
1 => '1',
2 => '12',
3 => '51',
4 => '00',
5 => '00',
6 => '5',
)
仅拆分所有非数字字符,
preg_split()
:
var_export(preg_split('/\D/', $string));
输出(与第二个片段相同):
array (
0 => '2012',
1 => '1',
2 => '12',
3 => '51',
4 => '00',
5 => '00',
6 => '5',
)
*注意,
sscanf()
还有一个替代用法,可以在第二个参数之后声明个人。如果为孤立值声明变量,函数的返回值将成为它进行匹配的次数。
第二个片段产生与第三个片段相同的输出,如果这是所需的数据,那么使用更简单的语法
preg_split()
更有意义。
正则表达式的其他变体(如果结构没有改变)
$re = '/(?<year>\d+)\-(?<month>\d+)\-(?<day>\d+)\s(?<hour>\d+):(?<minutes>\d+):(?<second>\d+)/m';
$str = '2012-1-12 51:00:00.5';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches[0]);
输出:
array(13) {
[0]=>
string(18) "2012-1-12 51:00:00"
["year"]=>
string(4) "2012"
[1]=>
string(4) "2012"
["month"]=>
string(1) "1"
[2]=>
string(1) "1"
["day"]=>
string(2) "12"
[3]=>
string(2) "12"
["hour"]=>
string(2) "51"
[4]=>
string(2) "51"
["minutes"]=>
string(2) "00"
[5]=>
string(2) "00"
["second"]=>
string(2) "00"
[6]=>
string(2) "00"
}