Отформатируйте дату, обозначенную числом дней с начала эпохи, в формате "y-m-d" без использования DateInterval. - PullRequest
2 голосов
/ 17 июня 2011

Слушай, я знаю, что мы должны идти дальше и уже устанавливать новейший php. Но я не могу. Так что я застрял с этим фрагментом кода, который я только что получил от фрилансера:

function daysToDate($days) {
    $interval = DateInterval::createFromDateString("+".round($days)." days");

    $d0 = new DateTime("1970-01-01");
    $d1 = $d0->add($interval);
    $res = $d1->format("Y-m-d");

    return $res;
}

Возвращает строковое представление даты, обозначенной количеством дней с начала эпохи ("1970-01-01"). Моя проблема в том, что я получаю следующее сообщение об ошибке:

Неустранимая ошибка: класс DateInterval не найден

Просматривая это в интернете, я обнаружил, что DateInterval для PHP> = 5.3. Я бегу 5.2. Мне уже приходилось кодировать обходной путь для обратной функции, когда я тестировал это на своем ПК:

/*
 * given a timestamp in the format 'Y-m-d h:i:s' (e.g. '2011-01-21 13:55:00'),
 * returns the count of days since the epoch ('1970-01-01 00:00:00')
 *
 * BUGFIX: I am using the strtotime here instead of DateInterval::days,
 * since that field is not set correctly in windows versions of PHP
 * (see PHP Bug #51184)
 */
function dateToDays($timestampstr) {
    $SECONDS_PER_DAY = 86400;

    $t = strtotime($timestampstr);

    return $t / $SECONDS_PER_DAY;
}

Теперь на моем тестовом сервере я обнаружил, что у меня вообще нет доступа к DateInterval.

Сейчас я ухожу на ланч и вознагражу любого, кто успешно закодирует версию PHP 5.2, с букетом интернетов, акцептом и upvote.

1 Ответ

4 голосов
/ 17 июня 2011

Кажется, довольно легко заставить работать 5,2

<?php
function daysToDate52($days) {
    return date("Y-m-d", strtotime("+$days days", 0));
}

var_dump(daysToDate(20));
var_dump(daysToDate52(20));

string(10) "1970-01-21"
string(10) "1970-01-21"

Надеюсь, это то, что вы хотели. Использование DateIntervall в любом случае там бессмысленно (по крайней мере, imho :))

Если вы хотите использовать объект DateTime (PHP 5.2), а не strtotime, тогда он будет выглядеть примерно так ( только небольшое изменение кода из вопроса ):

function daysToDateWithObject($days) {
    $x = new DateTime("1970-01-01");
    $x->modify("+$days days");
    return $x->format("Y-m-d");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...