strtotime可以处理分数吗?

时间:2012-06-18 15:29:05

标签: php strtotime

date('m/d/Y', strtotime('-1.5 years'))返回,今天(2012年6月18日),06/18/2017

为什么会这样,有没有办法让strtotime处理分数年?它似乎正在将“-1.5”改为“+5”。

编辑:所以你知道,这是在PHP 5.1上,因此新的日期函数不可用。

2 个答案:

答案 0 :(得分:4)

您最好的解决方案可能是将其转换为数月。因此1.5 years变为18 months,这将有效。

答案 1 :(得分:2)

已针对此问题打开错误报告https://bugs.php.net/bug.php?id=62353&edit=3

有一个名为timelib的库,它包含所有时间函数。似乎将相对时间转换为时间戳存在问题。

以下是创建相对时间的函数:

static void timelib_set_relative(char **ptr, timelib_sll amount, int behavior, Scanner *s)
{
    const timelib_relunit* relunit;

    if (!(relunit = timelib_lookup_relunit(ptr))) {
            return;
    }

    switch (relunit->unit) {
            case TIMELIB_SECOND: s->time->relative.s += amount * relunit->multiplier; break;
            case TIMELIB_MINUTE: s->time->relative.i += amount * relunit->multiplier; break;
            case TIMELIB_HOUR:   s->time->relative.h += amount * relunit->multiplier; break;
            case TIMELIB_DAY:    s->time->relative.d += amount * relunit->multiplier; break;
            case TIMELIB_MONTH:  s->time->relative.m += amount * relunit->multiplier; break;
            case TIMELIB_YEAR:   s->time->relative.y += amount * relunit->multiplier; break;

            case TIMELIB_WEEKDAY:
                    TIMELIB_HAVE_WEEKDAY_RELATIVE();
                    TIMELIB_UNHAVE_TIME();
                    s->time->relative.d += (amount > 0 ? amount - 1 : amount) * 7;
                    s->time->relative.weekday = relunit->multiplier;
                    s->time->relative.weekday_behavior = behavior;
                    break;

            case TIMELIB_SPECIAL:
                    TIMELIB_HAVE_SPECIAL_RELATIVE();
                    TIMELIB_UNHAVE_TIME();
                    s->time->relative.special.type = relunit->multiplier;
                    s->time->relative.special.amount = amount;
    }
}

注意:此错误也会导致同样的问题:

echo strtotime("1.5 days ago"); 

进入-5天,-5小时,而不是所需的-1天和12小时(相对)。