16

2 つの日時文字列の間の経過時間を取得しようとしています (ミリ秒を含む)

例:

$pageTime = strtotime("2012-04-23T16:08:14.9-05:00");
$rowTime = strtotime("2012-04-23T16:08:16.1-05:00");
$timePassed = $rowTime - $pageTime;
echo $timePassed . "<br/><br/>";

エコーされたいのは「1.2」ですがstrtotime()、文字列のミリ秒部分は無視されます。また、明らかmicrotime()に日付文字列を指定できません...これを計算するための代替関数はありますか、または秒とミリ秒を抽出して減算するために文字列解析を行う必要がありますか?

4

2 に答える 2

13

代わりにDateTimeを試してください。

DateInterval(これは によって返されDateTime::diff()ます) はマイクロ秒を計算しないため、これを手動で行う必要があるため、これには少し回避策が必要です。

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours");
$rowTime  = new DateTime("2012-04-23T16:08:16.9 - 5 hours");

// the difference through one million to get micro seconds
$uDiff = abs($pageTime->format('u')-$rowTime->format('u')) / (1000 * 1000);

$diff = $pageTime->diff($rowTime);

echo $diff->format('%s')-$uDiff;

柔軟性があるため、常にお勧めDateTimeします。検討する必要があります

編集

PHP 5.2 との下位互換性のために、ミリ秒の場合と同じアプローチを採用しています。

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours");
$rowTime  = new DateTime("2012-04-23T16:08:16.9 - 5 hours");

// the difference through one million to get micro seconds
$uDiff = abs($pageTime->format('u')-$rowTime->format('u')) / (1000 * 1000);


$pageTimeSeconds = $pageTime->format('s');
$rowTimeSeconds  = $rowTime->format('s');

if ($pageTimeSeconds + $rowTimeSeconds > 60) {
  $sDiff = ($rowTimeSeconds + $pageTimeSeconds)-60;
} else {
  $sDiff = $pageTimeSeconds - $rowTimeSeconds;
}


if ($sDiff < 0) {
  echo abs($sDiff) + $uDiff;
} else {
  // for the edge(?) case if $dt2 was smaller than $dt
  echo abs($sDiff - $uDiff);
}
于 2012-04-23T22:29:23.540 に答える
0

ダン・リーの答えに基づいて、普遍的に機能するソリューションを次に示します。

$pageTime = new DateTime("2012-04-23T16:08:14.9-05:00");
$rowTime  = new DateTime("2012-04-23T16:08:16.1-05:00");

$uDiff = ($rowTime->format('u') - $pageTime->format('u')) / (1000 * 1000);

$timePassed = $rowTime->getTimestamp() - $pageTime->getTimestamp() + $uDiff;

完全な説明:

  • 両方の日付の符号付きマイクロ秒差を保存し$uDiff、結果を 1000 * 1000 で割って秒単位に変換します。
  • のオペランドの順序$uDiffは重要であり、$timePassed 操作と同じにする必要があります。
  • 両方の日付の Unix タイムスタンプ (秒単位) の差を計算し、マイクロ秒の差を追加して、必要な結果を取得します。
  • を使用DateTime::getTimestamp()すると、差が 60 秒を超えても正解になります。
于 2016-07-12T20:04:19.640 に答える