たとえば、私が持っている場合:
$seconds = 3744000; // i want to output: 43 days, 8 hours, 0 minutes
これを変換する関数を作成する必要がありますか?それとも、PHPにはこれを行うための何かがすでに組み込まれていdate()
ますか?
たとえば、私が持っている場合:
$seconds = 3744000; // i want to output: 43 days, 8 hours, 0 minutes
これを変換する関数を作成する必要がありますか?それとも、PHPにはこれを行うための何かがすでに組み込まれていdate()
ますか?
function secondsToWords($seconds)
{
$ret = "";
/*** get the days ***/
$days = intval(intval($seconds) / (3600*24));
if($days> 0)
{
$ret .= "$days days ";
}
/*** get the hours ***/
$hours = (intval($seconds) / 3600) % 24;
if($hours > 0)
{
$ret .= "$hours hours ";
}
/*** get the minutes ***/
$minutes = (intval($seconds) / 60) % 60;
if($minutes > 0)
{
$ret .= "$minutes minutes ";
}
/*** get the seconds ***/
$seconds = intval($seconds) % 60;
if ($seconds > 0) {
$ret .= "$seconds seconds";
}
return $ret;
}
print secondsToWords(3744000);
これは非常にシンプルで、コアphpで日、時間、分、秒を簡単に見つけることができます。
$dbDate = strtotime("".$yourdbtime."");
$endDate = time();
$diff = $endDate - $dbDate;
$days = floor($diff/86400);
$hours = floor(($diff-$days*86400)/(60 * 60));
$min = floor(($diff-($days*86400+$hours*3600))/60);
$second = $diff - ($days*86400+$hours*3600+$min*60);
if($days > 0) echo $days." Days ago";
elseif($hours > 0) echo $hours." Hours ago";
elseif($min > 0) echo $min." Minutes ago";
else echo "Just now";
最近これを達成する簡単な方法はDateTimeImmutable
、DateInterval
およびPHP5.5.0以降を使用することです。
$seconds = 3744000;
$interval = new DateInterval("PT{$seconds}S");
$now = new DateTimeImmutable('now', new DateTimeZone('utc'));
$difference = $now->diff($now->add($interval))->format('%a days, %h hours, %i minutes');
結果は次のようになります。
43日、8時間、0分
コードは日付に秒を追加し、その差を計算します。このように、秒は指定された日、時間、分に変換されます。
警告1:UTCなしで動作-時計の変更
オブジェクトのコンストラクターでを指定することはできません。DateTimeZone
DateTimeImmutable
UTC
$now = new DateTimeImmutable();
この世界には、1年の特定の日に時計が変わる地域があります。たとえば、EUのほとんどの国は、夏と冬の間で変化します。
日付間隔が時計の変更が発生する日と重なっていて、サーバーがその時計の変更に関連するリージョンに設定されている場合、結果も変更される可能性があります。これは、次の例で最もよく示されます。
$twentyFourHours = new DateInterval('PT24H');
$twentyFiveHours = new DateInterval('PT25H');
//Pacific time changed from summer- to winter-time on that day
$summerToWinter = new DateTimeImmutable('2018-11-04');
日付に24時間を追加する$summerToWinter
と、次の結果が得られます。
$extra24Hours = $summerToWinter->add($twentyFourHours);
echo $summerToWinter->format('y-m-d H:i');
echo $extra24Hours->format('y-m-d H:i');
echo $summerToWinter->diff($extra24Hours)->format('%a days, %h hours, %i minutes');
18-11-04 00:00
18-11-04 23:00
0日、24時間、0分
ご覧のとおり、その日の00:00から23:00までは24時間でしたが、これは技術的には正しいことです。時計の変更により、その日の02:00から03:00までのタイムラップが2回発生しました。
25時間を追加すると、次のようになります。
$extra25Hours = $summerToWinter->add($twentyFiveHours);
echo $summerToWinter->format('y-m-d H:i');
echo $extra25Hours->format('y-m-d H:i');
echo $summerToWinter->diff($extra25Hours)->format('%a days, %h hours, %i minutes');
18-11-04 00:00
18-11-05 00:00
1日、0時間、0分
ご覧のとおり、1日が経過し、25時間経過しています。これを3744000
元の質問から数秒間適用すると、結果は次のようになります。
43日、7時間、0分
ただし、経過日が25時間であるという情報は表示されません。
また、23時間しか経過しない冬時間から夏時間に時計を変更する日についても、同じ効果を再現することはできませんでした。
警告2:生のDateIntervalオブジェクトを操作する
このコードを使用せずに使用DateTimeImmutable
すると、間違った出力が発生します。
$seconds = 3744000;
$interval = new DateInterval("PT{$seconds}S");
$difference = $interval->format('%a days, %h hours, %i minutes, %s seconds');
これで、オブジェクトに秒のみが設定されDateInterval
ます。$difference
だろう:
(不明)日、0時間、0分、37440秒
私はイアン・グレゴリーの答えが最も好きで、それを賛成しましたが、私はそれを少し単純化すると思いました:
function secondsToWords($seconds)
{
$days = intval(intval($seconds) / (3600*24));
$hours = (intval($seconds) / 3600) % 24;
$minutes = (intval($seconds) / 60) % 60;
$seconds = intval($seconds) % 60;
$days = $days ? $days . ' days' : '';
$hours = $hours ? $hours . ' hours' : '';
$minutes = $minutes ? $minutes . ' minutes' : '';
$seconds = $seconds ? $seconds . ' seconds' : '';
return $days . $hours . $minutes . $seconds;
}