使用简单的String In Date

时间:2014-11-22 15:40:47

标签: php regex datetime

我自己有这么一个字符串

citation
2d6h8y4m
d - days
min - min
h - h
y - years
m - months
s - seconds

我想将今天的日期添加为已保存的时间,即

2 days , 6 hours, 8 years and 4 months

我知道如何以一种简单的方式完成它 - 所有文本的循环和序列号读取,但我的猜测是它可以更简单地完成 - 一个正则表达式。对不起,如果有人给了我这样的功能或者某种程度上我的线索(例如,给出一个角色的模式)就够了,我可以叙述

@INFO

不明白仍然不想做今天的日期添加例如2天,4个月等。

即今天是2014-11-22 5:43:45 加入I 2天后6小时8年零4个月 2022-04-24 11:43:45 p.m。

3 个答案:

答案 0 :(得分:0)

单独int个值& char/word preg_match_all()。创建包含字符全部含义的array()(即h =小时)。然后只是foreach()。例如:

$avr = array('d'=>'days', 'min'=>'min','h'=>'hours', 'y'=>'years', 'm'=>'months', 's'=>'seconds');
$str = '2d6h8y4m';
preg_match_all('/\d+/', $str, $int);
preg_match_all('/[a-z]+/', $str, $word);
$len = count($int[0]) - 1;
$result = '';
foreach($int[0] as $k=>$v){
    if($len == $k){
        $result .= ' and ' . $v . '  ' . $avr[$word[0][$k]];
    }else{
        $suf = ($k == 0) ? '' : ', ';
        $result .= $suf . $v . '  ' . $avr[$word[0][$k]];
    }
}
echo $result;

<强>输出:

2  days, 6  hours, 8  years and 4  months

答案 1 :(得分:0)

你正在寻找的正则表达式是

(\d+)d(\d+)h(\d+)y(\d+)m

\d匹配任何数字。从中您可以提取括号之间匹配的内容。这是完整的代码:

preg_match("(\d+)d(\d+)h(\d+)y(\d+)m", "2d6h8y4m", $matches);

现在$matches将是一个数组,其中包含括号之间匹配的内容。 $matches[0]将是第一个括号(当天),$matches[1]将是第一个括号(小时)等。

答案 2 :(得分:0)

你为什么要重新发明轮子?

为什么不在[{3}}中存储时间间隔,例如:P8Y5M2DT6H

$date = new DateTime();
$interval = new DateInterval('P8Y5M2DT6H');
$date->add($interval);

ISO-8601 duration format