php "обратный отсчет до" и "с момента времени" функция времени по Гринвичу UTC - PullRequest
1 голос
/ 21 июля 2011

Я работаю с функцией, которую я нашел, чтобы сделать это, но я пытаюсь заставить ее работать с меткой времени GMT utc:

РЕДАКТИРОВАТЬ: Может быть, моя проблема с тем, как я "конвертирую""время ввода пользователя в GMT ...

Я делал

$the_user_input_date = strtotime('2011-07-20T01:13:00');
$utctime = gmdate('Y-m-d H:i:s',$the_user_input_date);

Неужели gmdate('Y-m-d H:i:s',$the_user_input_date); на самом деле не" конвертирует "его в gmt?это просто отформатировать?Возможно, это моя проблема.

Вот как может выглядеть время, которое я могу предоставить:

//local time in GMT
2011-07-20T01:13:00

//future time in GMT
2011-07-20T19:49:39

Я пытаюсь заставить это работать так:

    Started 36 mins ago
    Will start in 33 mins
    Will start in 6 hrs 21 mins
    Will start in 4 days 4 hrs 33 mins

Вот то, с чем я сейчас работаю:

EDIT: new php code im working with, seems to ADD 10 HOURS on to my date. Any ideas? I  updated it here:

function ago($from)
 {
  $to = time();

  $to = (($to === null) ? (time()) : ($to));
  $to = ((is_int($to)) ? ($to) : (strtotime($to)));
  $from = ((is_int($from)) ? ($from) : (strtotime($from)));

  $units = array
  (
   "year"   => 29030400, // seconds in a year   (12 months)
   "month"  => 2419200,  // seconds in a month  (4 weeks)
   "week"   => 604800,   // seconds in a week   (7 days)
   "day"    => 86400,    // seconds in a day    (24 hours)
   "hour"   => 3600,     // seconds in an hour  (60 minutes)
   "minute" => 60,       // seconds in a minute (60 seconds)
   "second" => 1         // 1 second
  );

  $diff = abs($from - $to);
  $suffix = (($from > $to) ? ("from now") : ("ago"));

  foreach($units as $unit => $mult)
   if($diff >= $mult)
   {
    $and = (($mult != 1) ? ("") : ("and "));
    $output .= ", ".$and.intval($diff / $mult)." ".$unit.((intval($diff / $mult) == 1) ? ("") : ("s"));
    $diff -= intval($diff / $mult) * $mult;
   }
  $output .= " ".$suffix;
  $output = substr($output, strlen(", "));

  return $output;
 }

@ Jason

Я попробовал то, что вы предложили здесь:

function ago($dateto)
    {
      $datetime1 = new DateTime( $dateto);
      $datetime2 = new DateTime();
      $interval = $datetime1->diff($datetime2);
      // print_r($interval);

      $format = '';
      if ($interval->h) {
              $format .= ' %h ' . ($interval->h == 1 ? 'hour' : 'hours');
      }
      if ($interval->i) {
              $format .= ' %i ' . ($interval->i == 1 ? 'minute' : 'minutes');
      }
      // more logic for each interval

      if ($format) {
              echo $interval->format($format), ' ago';
      }
      else {
              echo 'now';
      }
    }

Кажется, всегда добавляется 10 часов нак моему времени.

Есть идеи, что может происходить?

Может быть, ошибка в том, как я экономлю целевое время?Когда кто-то отправляет время, его преобразованное и сохраненное таким образом

Время, отправленное пользователем, всегда будет выглядеть так, как его местное время: 20.07.2011, 23:00

Тогда:

$time = mysql_real_escape_string($_POST['time']);

$the_date = strtotime($time);

//make user input time into GMT time
$utctime = gmdate('Y/m/d H:i:s',$the_date);

$query = "INSERT INTO $table (time) VALUES ('$utctime');";
mysql_query($query);

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Если у вас есть доступ к PHP> = 5.3, я бы порекомендовал DateTime::diff().Возвращаемое DateInterval дает вам все детали, необходимые для отображения, а также имеет свои собственные методы, такие как format().

Вот примерчтобы дать вам идею.В комментариях ссылок на документацию по PHP есть более полные примеры.

<?php
$datetime1 = new DateTime('2011-07-20');
$datetime2 = new DateTime();
$interval = $datetime1->diff($datetime2);
// print_r($interval);

$format = '';
if ($interval->h) {
        $format .= ' %h ' . ($interval->h == 1 ? 'hour' : 'hours');
}
if ($interval->i) {
        $format .= ' %i ' . ($interval->i == 1 ? 'minute' : 'minutes');
}
// more logic for each interval

if ($format) {
        echo $interval->format($format), ' ago';
}
else {
        echo 'now';
}

Выводит (в моей системе):

22 часа 10 минут назад

0 голосов
/ 21 июля 2011

Ваш $datefrom является строкой, но $dateto является int.Вы не можете вычесть их таким образом.

Вместо:

$datefrom=gmdate("Y/m/d\TH:i:s\Z");

Do:

$datefrom=time();

PS.Я не проверял остальную часть кода.

...