PHP: создание фильтра сегодня / вчера - PullRequest
1 голос
/ 01 ноября 2010

У меня есть фильтр здесь:

$today = time() - (3600*24);
$Yday = time() - (3600*48);


$getMsgsToday = mysql_query("SELECT * FROM users_msgs WHERE uID = '$USER' AND date > $today ORDER by date DESC LIMIT 10");


$getMsgsYday = mysql_query("SELECT * FROM users_msgs WHERE uID = '$USER' AND date BETWEEN $Yday AND $today ORDER by date DESC LIMIT 10");

, который не работает должным образом.Если время 01:00, в разделе «Сегодня» будут отображаться даты вчерашнего дня, например, 23:00, 22:00, 21:00, и сначала будет отображаться надпись «вчера» после более 01:00 дня после.

Как я могу это исправить, чтобы оно соответствовало времени?Итак, 00:01 сегодня, а 23:59 вчера .. Я думаю, что я сделал неправильно, просто делая время () - (3600 * 24) .. как мне поступить?

Ответы [ 6 ]

3 голосов
/ 01 ноября 2010

Вы, вероятно, получаете сообщение об ошибке, потому что вчера у нас было летнее время.С кодом ниже, это учитывается.Вы никогда не должны вычислять метки времени самостоятельно.Это подвержено ошибкам.

$now       = time();                 // gives timestamp of right now
$today     = strtotime('today')      // gives timestamp of today 00:00
$yesterday = strtotime('yesterday'); // gives timestamp for yesterday 00:00
$ts24hago  = strtotime('-24 hours'); // gives timestamp 24 hours ago

И я согласен с Эль Йобо, что это проще сделать прямо из MySql.

3 голосов
/ 01 ноября 2010

Нет необходимости вычислять эти вещи в PHP, делайте это в самом SQL.

-- Today's messages: round the "date" field to be only a date, not a timestamp, then compare
$getMsgsToday = mysql_query("SELECT * FROM users_msgs WHERE uID = '$USER' AND cast(`date` as date) = cast(now() as date) ORDER by date DESC LIMIT 10");

-- Yesterday's messages: round the "date" field to be only a date, then compare to today - 1 day
$getMsgsYday = mysql_query("SELECT * FROM users_msgs WHERE uID = '$USER' AND cast(`date` as date) = date_sub(cast(now() as date), interval 1 day) ORDER by date DESC LIMIT 10");

Функции манипуляции с датами в большинстве баз данных в любом случае проще, чем PHP, поэтому вам не нужно усложнять свою жизнь:)

0 голосов
/ 01 ноября 2010

Я думаю, вы хотите этого. Надеюсь, я могу помочь вам .....

//Date format(YYYY-MM-DD) change to timestamp 
function getTS($date){
    if (false ===preg_match('/\d{4}-\d{2}-\d{2}/i', $date))
        return 0;
    list($year,$month,$day) = explode('-',$date);
    return mktime(0,0,0,$month,$day,$year);
}
//Get Today and Yesterday Timestamp.
$today = getTS(date('Y-m-d'));
$Yday = getTS(date('Y-m-d',strtotime('yesterday')));

Применить скрипт sql.

$getMsgsToday = mysql_query("SELECT * FROM users_msgs WHERE uID = '{$USER}' AND date > {$today} ORDER by date DESC LIMIT 10");

$getMsgsYday = mysql_query("SELECT * FROM users_msgs WHERE uID = '{$USER}' AND date BETWEEN {$Yday} AND {$today} ORDER by date DESC LIMIT 10");
0 голосов
/ 01 ноября 2010
$today_start = strtotime(date('Y-m-d 00:00:00'));
$today_end = strtotime(date('Y-m-d 23:23:59'));
$yesterday_end = $today_start - 1;
$yesterday_start = $yesterday_end - 86399;
0 голосов
/ 01 ноября 2010
$today = date('Y-m-d',time());
$yesterday = date('Y-m-d',time() - 3600);
0 голосов
/ 01 ноября 2010

time () будет основываться на текущей временной отметке с точностью до секунды, где вам нужно начало текущего / предыдущих дней.Я бы предложил вместо этого использовать mktime , на сайте php есть множество примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...