Изменение сегодня, вчера и даты на этой неделе относительно относительного, удобочитаемого для человека формата

Я втягиваю некоторые твиты, и мне бы хотелось вывести, пришли ли они сегодня, вчера или раньше. Вот код, с которым я работаю (что не работает). Он пропускает if и else if и переходит прямо в else .

date_default_timezone_set("America/New_York");
$time = $block["created_at"];
$time = strtotime($time);

if(date("now") == date("m-d-Y", $time)) {
    $time = date("g:ia", $time);
}
else if(date(strtotime("-1 day")) == date("m-d-Y", $time)) {
    $time = "Yesterday at" + date("g:ia", $time);
}
else {
    $time = date("m-d-Y g:ia", $time);
}

Абсолютно идеально, мне также понравилось бы, если, когда отметка времени будет за последние 6 дней, она покажет день недели и время, и что-нибудь еще, чем это, покажет дату.

Таким образом, поток может выглядеть так (даты отсортированы по убыванию):

[...] 9:53 утра
  [...] 7:02 am
  [...] Вчера в 23:24
  [...] Понедельник в 15:45
  [...] 2 января 2013 г.

Любая идея о том, где мой код идет наперекосяк? Благодаря!

6
nl ja de
if (date ("m-d-Y") == date ("m-d-Y", $ time)) должен сначала позаботиться, если.
добавлено автор Salman A, источник
С помощью Сальмана я понял, что сегодня и вчера. Теперь я просто пытаюсь выяснить часть «старше 6 дней».
добавлено автор Jon, источник
Проверьте операнды на условные обозначения, и вы сможете понять, почему они не совпадают. Отладка.
добавлено автор Lightness Races in Orbit, источник
Также позаботьтесь о date («now»)
добавлено автор Jon Stirling, источник
Но если он зависит от даты сервера, он не будет работать все время ... потому что он изменчив. Попробуйте сохранить дату, в которую вы вставляете твиты, тогда будет легко сравнить даты и время.
добавлено автор Ofir Attia, источник

2 ответы

Ваш код должен выглядеть ниже.

if(date("m-d-Y") == date("m-d-Y", $time)) {
    $time = date("g:ia", $time);
}
else if(date("m-d-Y", strtotime("-1 day")) == date("m-d-Y", $time)) {
    $time = "Yesterday at" + date("g:ia", $time);
}
else {
    $time = date("m-d-Y g:ia", $time);
}

Explanation

date() - форматирование локального времени/даты. Возвращает строку, отформатированную в соответствии с заданной строкой формата, используя заданную метку времени или текущее время, если не указана метка времени. Другими словами, временная метка необязательна и по умолчанию используется значение time() .

Where have you gone wrong ?

Вы должны сначала передать формат, затем метку времени, в функцию date() . Подробнее .

6
добавлено
Спасибо, что указали это. Объяснение добавлено
добавлено автор Techie, источник
Пока вы ответили на вопрос. Вы не дали никаких объяснений.
добавлено автор Jason McCreary, источник
О, это здорово.
добавлено автор Lightness Races in Orbit, источник

Функция strtotime может анализировать различные строки:

echo date("D Y-m-d H:i:s");                              //Wed 2013-01-09 21:33:07
echo date("D Y-m-d H:i:s", strtotime("today 00:00" ));   //Wed 2013-01-09 00:00:00
echo date("D Y-m-d H:i:s", strtotime("yesterday 00:00"));//Tue 2013-01-08 00:00:00
echo date("D Y-m-d H:i:s", strtotime("-6 day 00:00" ));  //Thu 2013-01-03 00:00:00
echo date("D Y-m-d H:i:s", strtotime("-100 day 00:00" ));//Mon 2012-10-01 00:00:00

Все, что вам нужно сделать, это сравнить данную временную метку с приведенным выше в порядке убывания:

function formatDate($time) {
    if ($time >= strtotime("today 00:00")) {
        return date("g:i A", $time);
    } elseif ($time >= strtotime("yesterday 00:00")) {
        return "Yesterday at " . date("g:i A", $time);
    } elseif ($time >= strtotime("-6 day 00:00")) {
        return date("l \\a\\t g:i A", $time);
    } else {
        return date("M j, Y", $time);
    }
}

echo formatDate(time());                //9:42 PM
echo formatDate(strtotime("-1 day"));   //Yesterday at 9:42 PM
echo formatDate(strtotime("-6 day"));   //Thursday at 9:42 PM
echo formatDate(strtotime("-100 day")); //Oct 10, 2012

Обратите внимание, что strtotime() возвращает метку времени (целое число), а date() возвращает строку. Функция сравнивает временные метки с меткой времени.

2
добавлено
Фантастика! Спасибо, Салман.
добавлено автор Jon, источник
дата возврата («M n, Y», $ time) должна, вероятно, быть датой возврата («M d, Y», $ time) . date ('n') - это числовой месяц, а не день месяца.
добавлено автор Ian M., источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp