2

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

为什么会这样,有什么方法可以让 strtotime 处理小数年?它似乎正在将“-1.5”更改为“+5”。

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

4

2 回答 2

4

您最好的解决方案可能是将其转换为几个月。所以1.5 years变成18 months了哪个会起作用。

于 2012-06-18T15:31:23.660 回答
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小时(相对)。

于 2012-06-18T16:47:29.820 回答