给定一个Unix时间戳,如何得到那一天的开始和结束?
我有这样的Unix时间戳:
$timestamp=1330581600
如何获得当天的开始和该时间戳的一天结束?
eg $beginOfDay = Start of Timestamp's Day $endOfDay = End of Timestamp's Day
我试过这个:
$endOfDay = $timestamp + (60 * 60 * 23);
但我不认为它会起作用,因为时间戳本身并不是一天的确切开始。
时光可以用来快速切断小时/分钟/秒
$beginOfDay = strtotime("midnight", $timestamp); $endOfDay = strtotime("tomorrow", $beginOfDay) - 1;
date时间也可以使用,但需要一些额外的步骤来从一个很长的时间戳
$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('Ymd H:i:s e'), 'start' => $beginOfDay->format('Ymd H:i:s e'), 'end ' => $endOfDay->format('Ymd H:i:s e'), ) );
您可以使用date()
和mktime()
:
list($y,$m,$d) = explode('-', date('Ym-d', $ts)); $start = mktime(0,0,0,$m,$d,$y); $end = mktime(0,0,0,$m,$d+1,$y);
mktime()
足够聪明,可以在指定的月份之外给出一天的时间来包装月/年(jan 32nd将是feb 1st等)
只是date时间
$beginOfDay = DateTime::createFromFormat('Ymd H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Ymd 00:00:00'))->getTimestamp(); $endOfDay = DateTime::createFromFormat('Ymd H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Ymd 23:59:59'))->getTimestamp();
首先创build一个DateTime对象,并将时间戳设置为所需的时间戳。 然后,对象被格式化为一个string,将小时/分钟/秒设置为一天的开始或结束。 最后,从这个string创build一个新的DateTime对象,并检索时间戳。
可读
$dateTimeObject = new DateTime(); $dateTimeObject->setTimestamp($timestamp); $beginOfDayString = $dateTimeObject->format('Ymd 00:00:00'); $beginOfDayObject = DateTime::createFromFormat('Ymd 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();
时区
时区也可以通过将时间戳指示符添加到O
等格式并在创buildDateTime对象后指定时间戳来设置:
$beginOfDay = DateTime::createFromFormat('Ymd H:i:s O', (new DateTime())->setTimezone(new DateTimeZone('America/Los_Angeles'))->setTimestamp($timestamp)->format('Ymd 00:00:00 O'))->getTimestamp();
DateTime的灵活性
我们还可以通过更改指定的第二个格式来获取其他信息,例如月份的开始/结束或者小时的开始/结束。 月份: 'Ym-01 00:00:00'
和'Ymt 23:59:59'
。 对于小时: 'Ymd H:00:00'
和'Ymd H:59:59'
使用不同的格式与add()/ sub()和DateInterval对象结合,我们可以得到任何时期的开始或结束,虽然需要谨慎处理正确的闰年。
相关链接
从PHP文档:
- 约会时间
- date与格式的信息
- DateTimeZone
- DateInterval
您可以将时间转换为当前数据,然后使用strtotime函数来查找一天的开始,并简单地添加24小时以查找一天结束。
您也可以使用余数运算符(%)来查找最近的date。 例如:
$start_of_day = time() - 86400 + (time() % 86400); $end_of_day = $start_of_day + 86400;
今天开始date时间戳。 简单
$stamp = mktime(0, 0, 0); echo date('mdY H:i:s',$stamp);
对于将来有这个问题的人来说:
任何一天的代码
<?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; ?>
$start_of_day = floor (time() / 86400) * 86400; $end_of_day = ceil (time() / 86400) * 86400;
如果你需要在同一个脚本中的两个值。 其中一个variables的+/- 86400秒比同时触发地板和天花板要快。 例如:
$start_of_day = floor (time() / 86400) * 86400; $end_of_day = $start_of_day + 86400;