85

次のような Unix タイムスタンプがあります。

$timestamp=1330581600

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

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

私はこれを試しました:

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

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

4

12 に答える 12

188

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'),
    )
);

$now <= $endPHP7 での拡張時間の追加により、これでチェックを使用すると 1 秒を逃す可能性があります。チェックを使用$now < $nextStartすると、PHP の時間処理における秒数と夏時間の減算に関する奇妙さに加えて、そのギャップを回避できます。

于 2012-04-17T19:39:23.213 に答える
16

日時のみ

$beginOfDay = DateTime::createFromFormat('Y-m-d H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Y-m-d 00:00:00'))->getTimestamp();
$endOfDay = DateTime::createFromFormat('Y-m-d H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Y-m-d 23:59:59'))->getTimestamp();

最初に DateTime オブジェクトが作成され、タイムスタンプが目的のタイムスタンプに設定されます。次に、オブジェクトは、時間/分/秒を 1 日の始まりまたは終わりに設定する文字列としてフォーマットされます。最後に、この文字列から新しい DateTime オブジェクトが作成され、タイムスタンプが取得されます。

読み取り可能

$dateTimeObject = new DateTime();
$dateTimeObject->setTimestamp($timestamp);
$beginOfDayString = $dateTimeObject->format('Y-m-d 00:00:00');
$beginOfDayObject = DateTime::createFromFormat('Y-m-d H:i:s', $beginOfDayString);
$beginOfDay = $beginOfDayObject->getTimestamp();

この長いバージョンを使用して、別の方法で 1 日の終わりを取得できます。

$endOfDayObject = clone $beginOfDayOject(); // Cloning because add() and sub() modify the object
$endOfDayObject->add(new DateInterval('P1D'))->sub(new DateInterval('PT1S'));
$endOfDay = $endOfDayOject->getTimestamp();

タイムゾーン

タイムゾーンは、次のような形式にタイムスタンプ インジケーターを追加しO、DateTime オブジェクトの作成後にタイムスタンプを指定することによっても設定できます。

$beginOfDay = DateTime::createFromFormat('Y-m-d H:i:s O', (new DateTime())->setTimezone(new DateTimeZone('America/Los_Angeles'))->setTimestamp($timestamp)->format('Y-m-d 00:00:00 O'))->getTimestamp();

DateTime の柔軟性

指定された 2 番目の形式を変更することで、月の始まり/終わり、または時間の始まり/終わりなどの他の情報を取得することもできます。月の場合:'Y-m-01 00:00:00'および'Y-m-t 23:59:59'. 時間の場合:'Y-m-d H:00:00'および'Y-m-d H:59:59'

add()/sub() および DateInterval オブジェクトと組み合わせてさまざまな形式を使用すると、任意の期間の開始または終了を取得できますが、うるう年を正しく処理するには注意が必要です。

関連リンク

PHPドキュメントから:

于 2016-01-04T18:07:59.563 に答える
9

date()との組み合わせを使用できますmktime()

list($y,$m,$d) = explode('-', date('Y-m-d', $ts));
$start = mktime(0,0,0,$m,$d,$y);
$end = mktime(0,0,0,$m,$d+1,$y);

mktime()指定された月以外の日が指定された場合、月/年をラップするのに十分スマートです (1 月 32 日は 2 月 1 日など)。

于 2012-04-17T19:38:54.750 に答える
4

時刻を現在のデータに変換し、strtotime 関数を使用して 1 日の始まりを見つけ、それに 24 時間を追加するだけで 1 日の終わりを見つけることができます。

剰余演算子 (%) を使用して、最も近い日を見つけることもできます。例えば:

$start_of_day = time() - 86400 + (time() % 86400);
$end_of_day = $start_of_day + 86400;
于 2012-04-17T19:36:29.153 に答える
3

今日 開始日のタイムスタンプ。単純

$stamp = mktime(0, 0, 0);
echo date('m-d-Y H:i:s',$stamp);
于 2016-05-19T06:56:37.260 に答える
1
$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = ceil (time() / 86400) * 86400;

同じスクリプトで両方の値が必要な場合。変数の 1 つに対して +/- 86400 秒の方が、floor と ceil の両方を起動するよりも高速です。例えば:

$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = $start_of_day + 86400;
于 2016-03-22T22:56:23.653 に答える
0

将来この質問がある人のために:

任意の日のコード

<?php
$date = "2015-04-12 09:20:00";

$midnight = strtotime("midnight", strtotime($date));
$now = strtotime($date);

$diff = $now - $midnight;
echo $diff;
?>

当日コード

<?php
$midnight = strtotime("midnight");
$now = date('U');

$diff = $now - $midnight;
echo $diff;
?>
于 2015-03-30T09:29:19.553 に答える