2012-01-27 3 views
1

Нет, это не стандарт +86400 секунд между датами.Фактические дни между двумя временными метками unix в PHP

$start_time = strtotime("2012-01-15 23:59"); 
$end_time = strtotime("2012-01-16 00:05"); 

$ daysInBetweenTimestamps =?

Это проблема, с которой я сейчас сталкиваюсь, поскольку временные метки могут варьироваться от 5 минут до 5-часового временного интервала, например, с использованием стандартного +86400, чтобы узнать, не будет ли это более суток, и из-за огромное количество индексирования, которое я делаю, я хотел бы посмотреть, есть ли более эффективный способ проверить, начался ли новый день вместо того, чтобы делать дату («d»)> $ prevDay на втором уровне.

Обновление с испытанием для первого примера:

echo "Absolute Start: ".date("Y-m-d H:i:s",$start)."<br />"; 
echo "Absolute End: ".date("Y-m-d H:i:s",$end)."<br />"; 
echo "Interval Used: $interval(seconds) OR ".($interval/60)."(minutes)<br />"; 
$numberOfIntervals = ceil(($end - $start)/$interval); 
echo "Number of intervals:$numberOfIntervals<br /><br />"; 
if ($numberOfIntervals > 0){ 
    for ($i = 0; $i < $numberOfIntervals; $i++){ 
     $curStart = $start + ($interval * $i); 
     $curEnd = $curStart + $interval; 
     if ($curEnd > $end){$curEnd = $end;} 
     echo "Interval Start DateTime: ".date("Y-m-d H:i:s",$curStart)."<br />"; 
     echo "Interval End DateTime: ".date("Y-m-d H:i:s",$curEnd)."<br />"; 
/* EXAMPLE PHP5.3 DateTime START - NOT WORKING */ 
     $startDiff = new DateTime("@$curStart"); 
     $endDiff = new DateTime("@$curEnd"); 
     $diff = $startDiff->diff($endDiff); 
     echo $diff->format("%a") . " days<br />"; 
     if ($diff->format("%a") > 0){ 
/* EXAMPLE PHP5.3 DateTime END */ 
/* EXAMPLE Julian START - WORKS */ 
      $days = unixtojd($curEnd) - unixtojd($curStart); 
      echo "Number of days:$days<br />"; 
      if ($days > 0){ 
/* EXAMPLE Julian END */ 
       // Multiple days so the log files are split 
       echo "Multiple days so log files are split<br />"; 
      }else{ 
       echo "Single day so log files are NOT split<br />"; 
      } 
     } 
    } 

Выход выглядит следующим образом:

Absolute Start: 2012-01-25 23:59:00 
Absolute End: 2012-01-26 00:02:00 
Interval Used: 180(seconds) OR 3(minutes) 
Number of intervals:1 
Interval Start DateTime: 2012-01-25 23:59:00 
Interval End DateTime: 2012-01-26 00:02:00 

=== Пример 1 START ===

0 days 
Single day so log files are NOT split 

Я просто что-то пропустил на разнице?

=== Пример 1. КОНЕЦ ===

=== Пример 3. ПУСК ===

Number of days:1 
Multiple days so log files are split 

=== Пример 3. КОНЕЦ ===

+2

Вы не сказали нам, какое количество дней между двумя временными метками, если не прошло столько раз 86400 секунд. Какой вывод вы хотите для дат примера, которые вы указали. Сформулируйте проблему точно. –

+0

Одним из способов получения дат будет выполнение теста в начале и в конце, например: if (date ("d", $ end_time)> date ("d", $ start_time)) {$ multiDays = true;} 'А затем сделать последнее второе количество каждого дня и цикл между ними, это самый эффективный способ?' –

+0

Итак, проблема в том, что ... Файлы журнала Apache ежедневно вращаются и сохраняются в формате access_log.2012.11.15, моему приложению индексатора потребуется время начала и окончания timestamp unix. который может охватывать несколько дней. Вместо того, чтобы php вручную читать весь файл, я использую unix-инструменты * exec *, чтобы сделать это для меня ... Поэтому в моем цикле for я должен найти способ поймать, если есть изменение дней, чтобы посмотреть на новый файл журнала. Причина не для чтения этих файлов журналов с помощью php - некоторые из них имеют размер 2 + gig, а php имеет 256 Мбайт, поэтому я пытаюсь индексировать при небольшом определенном пользователем времени. –

ответ

2

Используйте Julian Day

$days = unixtojd($t1) - unixtojd($t2); 

или если вы не в UTC ...

$days = unixtojd($t1 - $tz) - unixtojd($t2 - $tz); 

где $tz - это ваш часовой пояс в секундах.

+0

Этот пример работает на основе моего обновленного кода выше со следующими обновлениями кода: * См. Пример 2 в обновленном исходном сообщении * –

+0

Это, по-видимому, мое любимое решение из-за его простоты, однако один быстрый вопрос, Директива php ini для установки часового пояса автоматически учитывает дополнительные второстепенные смещения? В рамках моей функции мне не нужно беспокоиться об этом, но просто любопытно ... Я думал, что выполнение временных функций с помощью директивы ini будет автоматически настраиваться? –

+0

вообще да, но юлианская дата - астрономическая концепция, а в астрономии UTC - единственный раз, когда это важно –

0

Прокрутите отметки времени до ближайшей 86400 секунд, воспользуйтесь разницей и разделите на 86400:

$start_time = strtotime("2012-01-15 23:59"); 
$end_time = strtotime("2012-01-16 00:05"); 

$start_time -= $start_time % 86400; 
$end_time -= $end_time % 86400; 

$days = ($end_time - $start_time)/86400; 

Округление делает каждую временную метку в полночь того дня, а подразделение дает вам количество дней с эпохи. Это будет работать только в UTC.

2

Используйте php5.3 в DateInterval класс:

$now = new DateTime(); 
$then = new DateTime("@123456789"); //this is your timestamp 

$diff = $now->diff($then); 

echo "then: " . $then->format("Y-m-d") . "\n"; 
echo $diff->format("%a") . " days\n"; 

выходы:

then: 1973-11-29 
13937 days 
+0

Обновлено мое оригинальное опубликуйте этот пример выше и, похоже, он не работает в том формате, который у меня есть. Я просто использую неправильный синтаксис, назначая первое PHP-время? –

0
<?php 
$start_time = strtotime("2012-01-15 23:59"); 
$end_time = strtotime("2012-01-16 00:05"); 

$time_zone = 19800; # My time zone: UTC+0530 hours = UTC+19800 seconds 

$days = intval(($end_time + $time_zone)/86400) - 
     intval(($start_time + $time_zone)/86400); 

echo "$days\n"; 
?> 
Смежные вопросы