不使用日期时间函数/方法将日期时间字符串拆分为其单独的组件

问题描述 投票:0回答:4

我有一根绳子

$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
        )
)
php datetime split text-extraction preg-split
4个回答
2
投票

您可以使用

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)
*/

1
投票

如您查询的评论中所述,需要三个爆炸:

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*/

希望这有帮助。当然,假设您的应用程序中的所有日期时间值都采用上述格式,这将起作用。


0
投票

使用

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()
更有意义。


0
投票

正则表达式的其他变体(如果结构没有改变)

$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"
}
© www.soinside.com 2019 - 2024. All rights reserved.