web-dev-qa-db-ja.com

Unixタイムスタンプが与えられた場合、その日の始まりと終わりを取得する方法は?

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

$timestamp=1330581600

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

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

私はこれを試しました:

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

しかし、タイムスタンプ自体がその日の正確な始まりではないので、私はそれが機能するとは思わない。

69
Talon

strtotimeを使用して、時間/分/秒をすばやく切り取ることができます

$beginOfDay = strtotime("midnight", $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;

// Go to midnight.  ->modify('midnight') does not do this for some reason
$beginOfDay->modify('today');

$endOfDay = clone $beginOfDay;
$endOfDay->modify('tomorrow');
// adjust from the next day to the end of the day, per original question
$endOfDay->modify('1 second ago');

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

ちょうどDateTime

$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オブジェクトが作成され、タイムスタンプが目的のタイムスタンプに設定されます。次に、オブジェクトは、時間/分/秒をその日の始まりまたは終わりに設定する文字列としてフォーマットされます。最後に、この文字列から新しい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();

日時の柔軟性

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

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

関連リンク

PHP docs:

10
Robert Hickman

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日など)

5
Cal

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

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

$start_of_day = time() - 86400 + (time() % 86400);
$end_of_day = $start_of_day + 86400;
4
James

今日開始日タイムスタンプ。シンプル

$stamp = mktime(0, 0, 0);
echo date('m-d-Y H:i:s',$stamp);
2
Ganesh
$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = ceil (time() / 86400) * 86400;

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

$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = $start_of_day + 86400;
0
Kareem

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

曜日コード

<?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;
?>
0