1. ホーム
  2. php

[解決済み] Unixのタイムスタンプが与えられたとき、その日の始まりと終わりを得るにはどうしたらいいですか?

2023-05-11 17:44:56

質問

私はこのようなUnixのタイムスタンプを持っています。

$timestamp=1330581600

そのタイムスタンプの日の始まりと終わりを取得するにはどうすればよいですか?

e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day

これを試してみました。

$endOfDay = $timestamp + (60 * 60 * 23);

でも、タイムスタンプ自体が正確な一日の始まりではないので、うまくいかないと思うのですが。

どのように解決するのですか?

strtotimeは、時間/分/秒を素早く切り取るために使用することができます。

$beginOfDay = strtotime("today", $timestamp);
$endOfDay   = strtotime("tomorrow", $beginOfDay) - 1;

DateTimeも使用できますが、長いタイムスタンプから取得するためにいくつかの余分な手順が必要です。

$dtNow = new DateTime();
// Set a non-default timezone if needed
$dtNow->setTimezone(new DateTimeZone('Pacific/Chatham'));
$dtNow->setTimestamp($timestamp);

$beginOfDay = clone $dtNow;
$beginOfDay->modify('today');

$endOfDay = clone $beginOfDay;
$endOfDay->modify('tomorrow');
// adjust from the start of next day to the end of the day,
// per original question
// Decremented the second as a long timestamp rather than the
// DateTime object, due to oddities around modifying
// into skipped hours of day-lights-saving.
$endOfDateTimestamp = $endOfDay->getTimestamp();
$endOfDay->setTimestamp($endOfDateTimestamp - 1);

var_dump(
    array(
        'time ' => $dtNow->format('Y-m-d H:i:s e'),
        'start' => $beginOfDay->format('Y-m-d H:i:s e'),
        'end  ' => $endOfDay->format('Y-m-d H:i:s e'),
    )
);

PHP7で時間延長が追加されたため、もし $now <= $end でチェックすると、1秒を逃す可能性があります。 使用方法 $now < $nextStart を使用すると、PHP の時刻処理における秒の引き算と夏時間に関する奇妙な問題に加えて、このギャップを避けることができます。