给定一个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;