За последние 24 часа нас посетил 20661 программист и 1324 робота. Сейчас ищут 679 программистов ...

Как вычислить продолжительность

Тема в разделе "Вопросы от блондинок", создана пользователем sound, 11 окт 2007.

  1. sound

    sound Guest

    Есть две переменые
    $Data_start
    $Data_end

    в них записана дата и время такого формата date('Y-m-d H:i:s')
    как вычислить продолжительность пробовал вычитать
    $m=$Data_end-$Date_start;

    но значение $m всегда получаеться раво нулю

    нужно чтобы писалось в итоге к примеру
    1 day 20 hours 54 minuts 22 seconds

    если скажем год и месяц совпадают то они бы вообще не печатались
    как это можо сделать ?
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
  3. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    sound
    Пишем форум? ;)
    Переводи обе даты в формат Unix-Timestamp (целое число), вычитай первое из второго, результат переводи в нужный тебе формат.
     
  4. sound

    sound Guest

    Dagdamor
    нет не форум бесплатных движков форумов и так полно везде
    а чем перевести дату в формат Unix-Timestamp какой фукцией ?? что то я найти не могу
    и какой функцией потом форматировать ???
     
  5. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
  6. sound

    sound Guest

    $m = strtotime($row->Date);
    $k = date('Y-m-d H:i:s');
    $f = strtotime($k);

    $s =$f-$m;
    echo date("Y-m-d H:i:s", $s);

    ну вот в Unix-Timestamp я преобразовал вычел одно время из другого а потом когда я обратно преобразовываю мне пишет к примеру 1970-01-04 03:28:17
    а это бред

    то есть я получил переменную $s в Unix-Timestamp формате которая показывает продолжительность то что мне нужна а как теперь преобразовать в нормальый вид немогу понять
     
  7. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Во первых.
    Код (Text):
    1. $f = time();
    И во вторых читаем комменты http://php.net/datetime
     
  8. sound

    sound Guest

    Sergey89
    ну и что ? читал я это уже
    можно по нормальному ответить что я делаю не так??
     
  9. sound

    sound Guest

    Sergey89
    или просто скопировать камент оттуда я немогу найти нужный
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Всё. Если сам не хочешь подумать головой, почитай комменты. Там есть решение твоей задачи.
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. function date_diff_as_text($ts1, $ts2) {
     
  12. sound

    sound Guest

    Ага только вот скрипт с ошибкой
    при любых значениях $ts1 и $ts2 выводит
    Notice: Undefined variable: days in C:\php20.tmp on line 19
    days 1 minute y 1 second

    PHP:
    1. function date_diff_as_text($ts1, $ts2) {
    2.  
    3.  
    4.  
    5.   $ts1 = strtotime($ts1);
    6.   $ts2 = strtotime($ts2);
    7.   $diff = abs($ts1-$ts2);
    8.  
    9.   $sec_min = 60;
    10.   $sec_hour = $sec_min*60;
    11.   $sec_dias = $sec_hour*24;
    12.  
    13.   $dias = intval($diff/$sec_dias);
    14.   $hours = intval($diff/$sec_hour)%24;
    15.   $minutes = intval($diff/$sec_min)%60;
    16.   $seconds = $diff%60;
    17.  
    18.   if ($dias > 0) {
    19.     $result = "$days day";
    20.     if ($dias > 1) {
    21.       $result .= "s";
    22.     }
    23.   }
    24.  
    25.   if ($hours > 0) {
    26.     $result .= " $hours hour";
    27.     if ($hours > 1) {
    28.       $result .= "s";
    29.     }
    30.   }
    31.  
    32.   if ($minutes > 0) {
    33.     $result .= " $minutes minute";
    34.     if ($minutes > 1) {
    35.       $result .= "s";
    36.     }
    37.   }
    38.  
    39.   if ($seconds > 0) {
    40.     $result .= " $seconds second";
    41.     if ($seconds > 1) {
    42.       $result .= "s";
    43.     }
    44.   }
    45.  
    46.   $result = explode(" ", $result);
    47.   if (count($result)>2) {
    48.     end($result);
    49.     $key1 = key($result);
    50.     prev($result);
    51.     $key2 = key($result);
    52.     $aux = $result[$key2];
    53.     $aux .= " ".$result[$key1];
    54.     unset($result[$key1]);
    55.     unset($result[$key2]);
    56.     $result = implode(" ", $result);
    57.     $result .= " y $aux";
    58.   } else {
    59.     $result = implode(" ", $result);
    60.   }
    61.  
    62.   return $result;
    63.  
    64. }
    65. $ts1 = "2006-01-05 10:30:45";
    66.   $ts2 = "2007-01-06 10:31:46";
    67.   echo date_diff_as_text($ts1, $ts2);
     
  13. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Что это было ??? 8-|
     
  14. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    А ошибка из-за того что слишком длинный...

    Код (Text):
    1. function date_diff_as_text($ts1, $ts2) {
    2.    return date('Y-m-d H:i:s', abs(strtotime($ts1)-strtotime($ts2)));
    3. }
     
  15. sound

    sound Guest

    S.t.A.M.
    ну да теперь выдает результат
    1970-11-07 03:01:01

    опять вернулся с чего начинал

    неужели это так сложно ??
    зачем поместили тему в раздел для блондинок
     
  16. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1. <?php
    2. function date_diff_as_text($ts1, $ts2) {
    3.   $diff = abs(strtotime($ts1)-strtotime($ts2)); // Получаем разницу в секундах
    4.  
    5.   // Дальше, зная сколько секунд в минуте, минут в часе, часов в сутках, и т.д. делим, выводим
    6.   $days = floor($diff/(60*60*24));
    7.   $diff = $diff%(60*60*24);
    8.  
    9.   $hours = floor($diff/3600);
    10.   $diff = $diff%3600;
    11.  
    12.   // ну и так далее
    13. }
     
  17. sound

    sound Guest

    AlexGousev
    ну а что далее то ?
    вставляю этот код в скрипт который я здесь написал работает все так же с ошибкой
    принцип то один считается сколько секунд в сутках месяце и так далее но ничего в итоге не работает
     
  18. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    sound
    Я рассказал принцип. Писать за вас функцию я не буду… по крайней мере бесплатно :)
     
  19. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    AlexGousev, не не совсем так...
    логику понял, если никто не поможет - завтра напишу - сейчас должен бежать...
     
  20. sound

    sound Guest

    AlexGousev
    а мне не нужно ничего писать я уже написал все смотри выше
    а вы просто повторили то же самое чуть в другой форме

    S.t.A.M.
    Эх буду ждать ошибку понять немогу
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $ts1 = strtotime("2006-10-12 12:10:00");
    3. $ts2 = time();
    4.  
    5. $diff = abs($ts2 - $ts1);
    6.  
    7. $y = floor($diff / (60 * 60 * 24 * 365)); $diff -= $y * 60 * 60 * 24 * 365;
    8. $m = floor($diff / (60 * 60 * 24 * 30)); $diff -= $m * 60 * 60 * 24 * 30;
    9. $d = floor($diff / (60 * 60 * 24)); $diff -= $d * 60 * 60 * 24;
    10. $h = floor($diff / (60 * 60)); $diff -= $h * 60 * 60;
    11. $i = floor($diff / 60); $diff -= $i * 60;
    12. $s = floor($diff);
    13.  
    14. print $y . " years " . $m . " month " . $d . " days " . $h . " hours " . $i . " minutes " . $s . " seconds ";
     
  22. sound

    sound Guest

    Sergey89
    спасибо

    а я окончательно привел это к нормальному виду
    PHP:
    1.  
    2. <?php
    3. function date_diff_as_text($ts1, $ts2) {
    4.  $diff = abs($ts2 - $ts1);
    5.  
    6.  $y = floor($diff / (60 * 60 * 24 * 365)); $diff -= $y * 60 * 60 * 24 * 365;
    7.  $m = floor($diff / (60 * 60 * 24 * 30)); $diff -= $m * 60 * 60 * 24 * 30;
    8.  $d = floor($diff / (60 * 60 * 24)); $diff -= $d * 60 * 60 * 24;
    9.  $h = floor($diff / (60 * 60)); $diff -= $h * 60 * 60;
    10.  $i = floor($diff / 60); $diff -= $i * 60;
    11.  $s = floor($diff);
    12.  
    13.  if ($y > 0){
    14.  $result = $y . " years " . $m . " month " . $d . " days " . $h . " h " . $i . " min " . $s . " sec ";
    15.  }
    16.  else
    17.  {
    18.  
    19.  if ($m > 0){
    20.  $result = $m . " month " . $d . " days " . $h . " h " . $i . " min " . $s . " sec ";
    21.  }
    22.  else
    23.  {
    24.   if ($d > 0){
    25.  $result = $d . " d " . $h . " h " . $i . " min " . $s . " sec ";
    26.  } 
    27.  else {
    28.    if ($h > 0){
    29.  $result = $h . " h " . $i . " min " . $s . " sec ";
    30.  }     
    31.  else
    32.  {
    33.     if ($i > 0){
    34.  $result = $i . " min " . $s . " sec ";
    35.  }
    36.  
    37.  }
    38.  
    39.  }
    40.  }
    41.  }
    42.  
    43.   return $result;}
    44.  
    45. $ts1 = strtotime("2007-10-12 07:59:55");
    46.  $ts2 = strtotime("2007-10-12 08:04:45");
    47.   echo date_diff_as_text($ts1, $ts2);
     
  23. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Осталось еще сделать, что бы он окончания правильно ставил: 1 year, 2 years и т.д.
     
  24. sound

    sound Guest

    S.t.A.M.
    ну мне это не важно продолжительность врятли будет больше нескольких часов
    эта функция должна быть стандартной в пхп какойто юникс формат надо делать бред
    надо просто вычитать одно из другого и ни о чем не думать
     
  25. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Гы... Придумал еще один вариант функции:
    Код (Text):
    1. function date_diff_as_text($ts1, $ts2) {
    2.     //1970-01-01 03:00:00 - абсолютный ноль по линуксу
    3.     $diff = abs(strtotime($ts1)-strtotime($ts2));
    4.     $res =
    5.     (date('Y',$diff)-1970)." years ".
    6.     (date('m',$diff)-1)   ." month ".
    7.     (date('d',$diff)-1)   ." day ".
    8.     (date('H',$diff)-3)   ." hours ".
    9.      date('i',$diff)      ." minuts ".
    10.      date('s',$diff)      ." seconds";            
    11.    return $res;
    12. }
    Ну и кто захочет потестить код ее вызывающий:
    Код (Text):
    1. $ts2 = "2007-10-12 07:59:55";
    2. $ts1 = "2007-10-12 08:04:45";
    3. echo date_diff_as_text($ts1, $ts2);