span - php diff %a




PHPで2つの日付間の時間数を計算する (9)

2つの日付の時間差を計算するにはどうすればよいですか?

例えば:

day1=2006-04-12 12:30:00
day2=2006-04-14 11:30:00

この場合、結果は47時間になるはずです。

https://code.i-harness.com


2つの日付(datetimes)の間の正しい時間数を得るための最も簡単な方法は、夏時間の変更であっても、UNIXのタイムスタンプの違いを使用することです。 UNIXのタイムスタンプは、1970-01-01T00:00:00 UTCから経過した秒数で、うるう秒を無視しています(これはおそらくこの精度が必要ないため、うるう秒を考慮に入れるのが非常に難しいためです)。

オプションのタイムゾーン情報を含む日時文字列をUnixタイムスタンプに変換する最も柔軟な方法は、 DateTimeオブジェクトを作成し(オプションで、コンストラクタの2番目の引数としてDateTimeZoneを使用)、 getTimestampメソッドを呼び出します。

$str1 = '2006-04-12 12:30:00'; 
$str2 = '2006-04-14 11:30:00';
$tz1 = new DateTimeZone('Pacific/Apia');
$tz2 = $tz1;
$d1 = new DateTime($str1, $tz1); // tz is optional,
$d2 = new DateTime($str2, $tz2); // and ignored if str contains tz offset
$delta_h = ($d2->getTimestamp() - $d1->getTimestamp()) / 3600;
if ($rounded_result) {
   $delta_h = round ($delta_h);
} else if ($truncated_result) {
   $delta_h = intval($delta_h);
}
echo "Δh: $delta_h\n";

UNIXのタイムスタンプを渡すには、この表記法を使用します

$now        = time();
$now        = new DateTime("@$now");

DatePeriod別のメソッドを提供する。

日付間の秒数または時間数を計算することなく、適用可能なタイムゾーンで夏時間を考慮に入れます。

カウント時間 (例: https://3v4l.org/Vom6N : https://3v4l.org/Vom6N

$date1 = new \DateTime('2006-04-12T12:30:00');
$date2 = new \DateTime('2006-04-14T11:30:00');

//determine what interval should be used - can change to weeks, months, etc
$interval = new \DateInterval('PT1H');

//create periods every hour between the two dates
$periods = new \DatePeriod($date1, $interval, $date2);

//count the number of objects within the periods
$hours = iterator_count($periods);
echo $hours . ' hours'; 

結果

47 hours

夏時間のカウント時間 (例: https://3v4l.org/eO9KE : https://3v4l.org/eO9KE

//set timezone to UTC to disregard daylight savings
ini_set('date.timezone', 'America/New_York'); 
$date1 = new \DateTime('2006-01-01T12:00:00');
$date2 = new \DateTime('2006-06-01T12:00:00');
$interval = new \DateInterval('PT1H');

$periods = new \DatePeriod($date1, $interval, $date2);
$hours = iterator_count($periods);
echo $hours . ' hours';

結果

3623 hours

同じ方法を使用して、給与期間を決定し、それらを数える代わりに検索することができます。

支払い期間 (例: https://3v4l.org/WQoh5 : https://3v4l.org/WQoh5

$interval = new \DateInterval('P2W');
$payPeriodStart = new \DateTime('2012-08-12T00:00:00');
$today = new \DateTime('2016-03-04T12:00:00');
$today->add($interval);
$payPeriods = new \DatePeriod($payPeriodStart, $interval, $today);
$payPeriods = array_reverse(iterator_to_array($payPeriods));

$recent = [
   'current' => [
       'start' => $payPeriods[1]->format('Y-m-d'),
       'end' => $payPeriods[0]->format('Y-m-d')
   ],
   'previous' => [
       'start' => $payPeriods[2]->format('Y-m-d'),
       'end' => $payPeriods[1]->format('Y-m-d')
   ]
];
var_dump($recent);

結果

array(2) {
  ["current"]=>
  array(2) {
    ["start"]=>
    string(10) "2016-02-21"
    ["end"]=>
    string(10) "2016-03-06"
  }
  ["previous"]=>
  array(2) {
    ["start"]=>
    string(10) "2016-02-07"
    ["end"]=>
    string(10) "2016-02-21"
  }
}

あなたの答えは:

round((strtotime($day2) - strtotime($day1))/(60*60))


これは私のプロジェクトで働いています。 私は、これはあなたのために役立つと思う。

日付が過去である場合、反転は1になります。
Dateが将来の場合、反転は0になります。

$defaultDate = date('Y-m-d');   
$datetime1   = new DateTime('2013-03-10');  
$datetime2   = new DateTime($defaultDate);  
$interval    = $datetime1->diff($datetime2);  
$days        = $interval->format('%a');
$invert      = $interval->invert;

新しいPHPバージョンでは、 DateTimeDateIntervalDateTimeZoneDatePeriodという新しいクラスが提供されています。 このクラスについてのクールなことは、異なるタイムゾーン、うるう年、うるう秒、夏時間などを考慮することです。その上で、使い方はとても簡単です。 このオブジェクトの助けを借りてあなたが望むものは次のとおりです:

// Create two new DateTime-objects...
$date1 = new DateTime('2006-04-12T12:30:00');
$date2 = new DateTime('2006-04-14T11:30:00');

// The diff-methods returns a new DateInterval-object...
$diff = $date2->diff($date1);

// Call the format method on the DateInterval-object
echo $diff->format('%a Day and %h hours');

返されるDateIntervalオブジェクトは、 format以外のメソッドも提供しformat 。 結果を数時間だけにしたい場合は、次のようにすることができます:

$date1 = new DateTime('2006-04-12T12:30:00');
$date2 = new DateTime('2006-04-14T11:30:00');

$diff = $date2->diff($date1);

$hours = $diff->h;
$hours = $hours + ($diff->days*24);

echo $hours;

次に、ドキュメントのリンクを示します。

これらのクラスはすべて、日付で操作するための手続き的/機能的な方法を提供します。 したがって、概要を見てみましょう: http://php.net/manual/book.datetime.php : http://php.net/manual/book.datetime.php


$day1 = "2006-04-12 12:30:00"
$day1 = strtotime($day1);
$day2 = "2006-04-14 11:30:00"
$day2 = strtotime($day2);

$diffHours = round(($day2 - $day1) / 3600);

私はstrtotime()関数がこの日付形式を受け入れると思います。


$t1 = StrToTime ( '2006-04-14 11:30:00' );
$t2 = StrToTime ( '2006-04-12 12:30:00' );
$diff = $t1 - $t2;
$hours = $diff / ( 60 * 60 );

//Calculate number of hours between pass and now
$dayinpass = "2013-06-23 05:09:12";
$today = time();
$dayinpass= strtotime($dayinpass);
echo round(abs($today-$dayinpass)/60/60);




datetime