1

これを行うことがわかった関数を使用していますが、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;
 }

@ジェイソン

ここであなたが提案したことを試しました:

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 時間増えているようです。

何が起こっているのでしょうか?

たぶん、目標時間の保存方法にエラーがありますか? 誰かが時間を送信すると、このように変換されて保存されます

ユーザーが送信した時間は常に、現地時間として次のように始まります: 07/20/2011 11:00 pm

それで:

$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);
4

2 に答える 2

2

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分前

于 2011-07-21T02:01:08.077 に答える
0

あなた$datefromは文字列です$datetoが、intです。そのようにそれらを差し引くことはできません。

それ以外の:

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

行う:

$datefrom=time();

PS。残りのコードはチェックしませんでした。

于 2011-07-21T00:20:24.443 に答える