解析 Ydm.His 格式的日期时间字符串

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

我有一个像下面这样的字符串

$num = "20142311.235504";

我想按照以下格式分割字符串

$date['year'] = 2014;
$date['Month'] = 23;
$date['day'] = 11;
$date['hour'] = 23;
$date['min'] = 55;
$date['sec'] = 04;

或者甚至是像下面这样的日期形式

2014/23/11 23:55:04

我尝试使用

preg_split('/(d{4})/',$num,$matches);
str_split
但没有得到所需的输出。

php regex datetime text-parsing date-parsing
3个回答
3
投票

如果字符串是日期,你可以这样做:

$num = "20142311.235504";

// You create a date with your string according to your current format
$date = date_create_from_format("Ydm.His", $num);

// Now you can play with it
$formattedDate = $date->format("Y/d/m H:i:s"); // `string(19) "2014/23/11 23:55:04"` 

$dateTest['year']  = $date->format("Y"); // 2014
$dateTest['Month'] = $date->format("m"); // 11
$dateTest['day']   = $date->format("d"); // 23
$dateTest['hour']  = $date->format("H"); // 23
$dateTest['min']   = $date->format("i"); // 55
$dateTest['sec']   = $date->format("s"); // 04

此处演示:http://sandbox.onlinephpfunctions.com/


0
投票

借助正则表达式,您可以做到这一点。在模式中创建服装年、月、日、小时、分钟和秒的捕获组。简单示例

$str = "20142311.235504";
preg_match('~^(?<year>\d{4})(?<day>\d{2})(?<month>\d{2}).(?<hour>\d{2})(?<minute>\d{2})(?<second>\d{2})$~', $str, $match);

echo '<pre>', print_r($match);

但是我准备让你使用

date_create_from_format()
,它比正则表达式更容易、更快。首先,转换由
-
分隔的已知日期格式,分解该格式以转换数组,最后将数组分配给一组键 [通过 array_combine()]。 示例

$str = "20142311.235504";
$match = array_combine(['year', 'month', 'day', 'hour', 'minute', 'second'], explode('-', (date_create_from_format("Ydm.His", $str))->format('Y-m-d-H-i-s')));
echo '<pre>', print_r($match);

0
投票

您的示例中有一个错误,表明月份是

23
。 无论如何,我会回答问题的现状。

$num = "20142311.235504";

sscanf(
    $num,
    '%04s%02s%02s.%02s%02s%02s',
    $result['year'],
    $result['month'],
    $result['day'],
    $result['hour'],
    $result['minute'],
    $result['second']
);
var_export($result);

或者

[
    $result['year'],
    $result['month'],
    $result['day'],
    $result['hour'],
    $result['minute'],
    $result['second']
] = sscanf(
    $num,
    '%04s%02s%02s.%02s%02s%02s'
);
var_export($result);

如果您只想重新格式化数组,则可以使用

vprintf()
将解析后的数组数据打印为字符串。 演示

$num = "20142311.235504";

vprintf(
    '%s-%s-%s %s:%s:%s',
    sscanf($num, '%04s%02s%02s.%02s%02s%02s')
);
// 2014-23-11 23:55:04
© www.soinside.com 2019 - 2024. All rights reserved.