PHP strtotime () функция - PullRequest
       9

PHP strtotime () функция

4 голосов
/ 29 августа 2011

У меня есть файл со следующими строками. Я хочу идентифицировать строки с временными метками менее недели (начиная с 22 августа для этого примера).

log3.txt
28-08-2011 10:29:25 A string
29-08-2011 14:29:25 A new string
20-08-2011 14:29:25 Don’t include

php file

if($file = fopen("/opt/apache2/htdocs/log3.txt", "r"))
{
    while(!feof($file))
    {
        $contents = fgets($file, 23); // This is supposed to be 22.
        echo $contents; // With 22 it only returns 08-29-2011 14:29:25 P
        if(strtotime($contents) > strtotime("last Monday"))
        {
            $string1 = fgets($file);
            echo "In if $string1";
            // Do something
        }
        else
        {
            $string1 = fgets($file);
            echo "In else $string1"; //Always goes to else statement.
        }
    }
}

Временные метки создаются с date('m-d-Y H:i:s').

Зачем fgets нужно 23 символа, тогда как на самом деле их 22.

Что я делаю не так с strtotime?

Как лучше всего анализировать строки с отметками времени меньше недели назад.

РЕДАКТИРОВАТЬ: начало работать

$date = DateTime::createFromFormat('d-m-Y H:i:s', $contents);

if(strtotime($date->format('d-m-Y H:i:s')) > strtotime("last Monday"))

Используйте функцию DateTime с форматом d-m-Y или m/d/Y.

Спасибо за помощь, ребята.

Ответы [ 5 ]

4 голосов
/ 29 августа 2011

Используйте взамен DateTime :: createFromFormat. У strtotime () могут быть проблемы с определением используемого формата вашей даты.

$date = DateTime::createFromFormat('d-m-Y H:i:s A', $contents);
1 голос
/ 29 августа 2011

Параметр длины fgets() включает символ новой строки (\n), поэтому для этого параметра необходимо передать 22 + 1.

Использование fread() было бы более подходящим для этого случая.

Для strtotime:

strtotime не распознает ваш формат даты, поэтому вы должны проанализировать его с помощью другой функции. strptime может сделать это:

strptime('08-29-2011 10:29:25 AM', '%m-%d-%Y %H:%M:%S %p')
0 голосов
/ 23 марта 2017

Мне не нравится, когда strtotime() бросают под автобус.Это не зло.Он обладает большой гибкостью, но он может зайти так далеко.

$contents просто нужно настроить так, чтобы strtotime() понимал, что вы кормите его по-европейски.Вам даже не нужно менять какие-либо цифры.

Использование:

if(strtotime(str_replace("/","-",$contents)) > strtotime("last Monday")){

Это более простое решение, чем создание нового объекта для каждой итерации.

0 голосов
/ 29 августа 2011

Ваши даты не являются правильным форматом для strtotime для возврата timestamp:

$dt = strtotime("08-29-2011 10:29:25 AM");
var_dump($dt); // false

Обновление
Но это работает я:

$lm = strtotime('last Monday');
$dt = strtotime('23-08-2011');

if($dt > $lm) {
   echo "In if"; // output for dates earlier than 23-08 
} else {
   echo "In else"; // output for 23-08 and later
}
0 голосов
/ 29 августа 2011

Цитировать со справочной страницы :

Чтение заканчивается, когда длина - 1 байт была прочитана, на новой строке (которая включена в возвращаемое значение) или на EOF (что наступит раньше) Если длина не указана, он будет продолжать чтение из потока, пока не достигнет конца строки.

Что касается разговора, я бы использовал strptime () , так как формат вашей даты фиксирован:

if(strptime($contents, 'm-d-Y H:i:s A') > strtotime("last Monday"))

Если это не поможет, пожалуйста, var_dump() два strtotime() и опубликуйте результаты.

...