Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Разница двух дат


Автор: semnt 6.11.2005, 00:07
Offtop: Как же надоело, что теоретические способы решения задач, рассматриваемые в литературе, не имеют реальной силы при реализации на практике smile Всегда приходится наворачивать алгоритм своими собственными фишками, которые не дают ошибаться "стандартным" функциям...

Простая задача. Необходимо измерить время, прошедшее с какого-то предыдущего момента с точностью до миллисекунды.
Используем функцию microtime();
Функция microtime() возвращает строку. В строке два числа разделённые пробелом. Второе число - кол-во секунд, прошедших с начало эпохи (00:00:00 01.01,1970). Первое число - кол-во миллисекунд, прошедших с начала секунды (первое число).
Создаём функцию now(), которая будет возвращать одно число (дата на данный момент: секунды+миллисекунды).
Код

function now() {
  $time=explode(" ",microtime());
  return $time[0]+$time[1];
}

Всё отлично. Проверяем как она будет работать.
Код

for($i=0;$i<1000;$i++) { //1000 действий для проверки стабильности.
  $time1=now(); //Начальная точка
    //Какое либо действие----
  $array=range(0,1000);
  shuffle($array);

  $time2=now(); //Конечная точка
    //Здесь уже знаем о нестабильности. Показываем что она действительно есть.
  if ($time2<$time1) {
    echo "Ошибка в действии $i. time2=".$time2."; time1=".$time1."; time2-time1=".($time2-$time1)." - число отрицательное!!<br>";
  }
}

Объясняю. Ошибкой считается ситуация, когда результат функции microtime() в определённый момент времени меньше, чем результат этой же функции, но в предыдущий момент времени.
У меня получается примерно 10 действий с ошибкой на все 1000 действий.

Что? Почему? Как заставить работать нормально??....

Автор: AztEK 6.11.2005, 19:10
ХМ...А у меня всё работатет.
Apache 1.3.1 + PHP 4.3.10

Автор: Mal Hack 6.11.2005, 19:45
Код

 function getmicrotime()
  {
   $mt = explode( " ", microtime() );
   return ( (float)$mt[0] + (float)$mt[1] );
  }

 $time_start = getmicrotime();

  $array=range(0,1000);
  shuffle($array);

 $time_end = getmicrotime();
 $test = $time_end - $time_start;

 print "<br><br>Script works " . round( $test , 4 ) . " seconds<br><br>";
 flush();

?>



Цитата(semnt @ 6.11.2005, 01:07)
В строке два числа разделённые пробелом. Второе число - кол-во секунд, прошедших с начало эпохи (00:00:00 01.01,1970). Первое число - кол-во миллисекунд, прошедших с начала секунды (первое число).

Неа.
Цитата
returns the current Unix timestamp with microseconds

Первая ьполовина - секунды с 1970, вторая - милисекунды текущей секунды.

Автор: semnt 7.11.2005, 00:18
Цитата
Первая ьполовина - секунды с 1970, вторая - милисекунды текущей секунды.

Превда?)
echo microtime(); //И ясно, что наоборот)

Загрузил свой пример на хост (Apache/1.3.33. PHP Version 4.3.11). Вроде работает без ошибок.
А на локальной машине не хочет(Apache/1.3.19. PHP Version 4.0.4pl1). Может дело в том, что на локальной машине стоит Windows.
Вобщем непонятно.

Автор: Mal Hack 7.11.2005, 02:09
Цитата(semnt @ 7.11.2005, 01:18)
echo microtime(); //И ясно, что наоборот)

Так, да... Ступил.

Цитата(semnt @ 7.11.2005, 01:18)
А на локальной машине не хочет(Apache/1.3.19. PHP Version 4.0.4pl1). Может дело в том, что на локальной машине стоит Windows.

Проверил на винде, все нормально.
У тебя конечно версия PHP старая очень, что не есть хорошо.

Подумай на счет вот этого. Условие всегда ложно !!
Цитата(semnt @ 6.11.2005, 01:07)
  if ($time2<$time1) {


Автор: semnt 7.11.2005, 12:46
Понятно... видимо php действительно уже стар)
Цитата
Подумай на счет вот этого. Условие всегда ложно !!

Ну да... я и проверял скрипт на стабильность этим условием.

Автор: Mal Hack 7.11.2005, 14:47
Цитата(semnt @ 7.11.2005, 13:46)
Ну да... я и проверял скрипт на стабильность этим условием.

Это же в теории невозможно smile))

Автор: kat_ru 7.3.2008, 17:46
У меня иногда вот такой результат получается это что? 
Цитата

9.9897384643555E-5

Автор: Feldmarschall 7.3.2008, 17:49
http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C

Автор: CyClon 7.3.2008, 18:47
kat_ru, ~9.9 в степени -5.

Автор: SelenIT 7.3.2008, 20:57
CyClon, не совсем ;)

kat_ru, это 0.000099897384643555

Автор: Serkys 8.3.2008, 13:54
Позволю себе напомнить вам, что начиная с PHP5 в функцию microtime() можно передать true и мы получим float, а не непонятно зачем созданный формат "микросекунды-пробел-секунды".

Никто не подскажет, зачем был нужен такой странный формат?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)