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 years18 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"); 

希望する -1 日と 12 時間 (相対) ではなく、-5 日と -5 時間になります。

于 2012-06-18T16:47:29.820 に答える