4

たとえば、私が持っている場合:

$seconds = 3744000; // i want to output: 43 days, 8 hours, 0 minutes

これを変換する関数を作成する必要がありますか?それとも、PHPにはこれを行うための何かがすでに組み込まれていdate()ますか?

4

4 に答える 4

22
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);
于 2012-05-19T19:51:46.817 に答える
2

これは非常にシンプルで、コア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";
于 2013-09-25T07:29:59.017 に答える
2

最近これを達成する簡単な方法はDateTimeImmutableDateIntervalおよび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なしで動作-時計の変更

オブジェクトのコンストラクターでを指定することはできませんDateTimeZoneDateTimeImmutableUTC

$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秒

于 2018-04-20T10:06:45.900 に答える
1

私はイアン・グレゴリーの答えが最も好きで、それを賛成しましたが、私はそれを少し単純化すると思いました:

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;
}
于 2018-04-20T09:45:40.437 に答える