给定一个Unix时间戳,如何开始和结束这一天?只是日期时间读时区日期时间的灵活性相关链接

2022-08-30 07:56:40

我有一个这样的Unix时间戳:

$timestamp=1330581600

如何获取该时间戳的一天的开始和结束时间?

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

我试过这个:

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

但我认为它不会起作用,因为时间戳本身并不是一天的确切开始。


答案 1

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 中延长时间的增加,如果使用此检查,则可能会错过一秒钟。使用检查可以避免这种差距,此外,在PHP的时间处理中,除了减少秒数和夏令时的奇怪之处。$now <= $end$now < $nextStart


答案 2

只是日期时间

$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();

我们可以使用这个更长的版本以另一种方式结束一天:

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

时区

也可以通过在创建 DateTime 对象后将时间戳指示器添加到格式中并指定时间戳来设置时区:O

$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();

日期时间的灵活性

我们还可以通过更改指定的第二种格式来获取其他信息,例如月份的开始/结束或小时的开始/结束。对于月份:和 .对于小时:和'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 文档:


推荐