在今天的午夜获取时间戳?


123

我将如何在今天午夜在php中获取时间戳。假设今天是星期一下午5点,我希望星期一(今天)在午夜(12点)的时间戳已经发生。

谢谢


午夜既不是上午也不是下午。同样从技术上讲,不存在午夜的时间戳。
hakre 2012年

16
@hakre我不同意你的看法。午夜是上午,无论时间戳采用什么格式,午夜都有一个值。
G-Nugget 2012年

1
如果今天或明天考虑00:00:00。从技术上讲,今天午夜几乎一直在我们身后。您或多或少需要“今晚”的23:59:59或“今天,即明天”的午夜00:00:00。
wesside 2012年

5
00:00:00的时间将是今天的午夜,因为到达已经发生的00:00:00需要花费很多时间。今晚23:59:59 如果按照今天来讲。午夜是上午。
纳斯卡2014年

4
00:00是一天开始的午夜,24:00是一天结束的午夜。但是,为简单起见,大多数数字时钟都跳过24:00-宣布午夜是新的一天的开始。实际上,2月8日24:00和2月9日00:00是同一时间点。
约翰

Answers:


239
$timestamp = strtotime('today midnight');

您可能想看看PHP提供了什么:http : //php.net/datetime


52
@SamHuckaby:甚至更容易:$timestamp = strtotime('today');是午夜。但是pssst上面的一个问题看起来更酷;)
hakre 2012年

我实际上需要从今天开始和今天午夜开始。我如何找到今天的开始,我的意思是00:00:00
Happy Coder

3
@AlwinAugustin:您应该考虑改变措辞。从技术上讲,午夜介于两天之间。因此,有些“今天不再存在”。另外:今天的午夜(按定义)是(今天之前)今天的开始。您可能是指今天中午之后的下一个午夜
hakre

是的,实际上我需要的是今天的00:00:00和今天的23:59:59
Happy Coder

2
请记住,这将产生PHP服务器时区的午夜,而不是UTC + 0!要获取UTC + 0,可以使用strtotime('today+00:00')

73

我认为您应该使用新的PHP DateTime对象,因为在执行日期超出strtotime()的32位限制的情况下,它没有任何问题。这是一个如何获取午夜今天日期的示例。

$today = new DateTime();
$today->setTime(0,0);

或者,如果您使用的是PHP 5.4或更高版本,则可以通过以下方式进行操作:

$today = (new DateTime())->setTime(0,0);

然后,您可以使用echo $today->format('Y-m-d');获取所需的对象输出格式。

PHP DateTime对象


14
我也更喜欢使用新的DateTime对象。如果将此答案与@ hakr's结合使用,则会得到:new DateTime('today midnight'),这使意图更加清晰(但这当然是一个品味问题)。
Martijn 2014年

1
我正在执行ORM SQL工作,必须使用DateTime对象进行比较。这正是我想要的。+1
NobleUplift 2015年

可能是$today = new DateTime('today')
ProgZi

如果您使用从DateTime继承的Carbon,它也很有用。因此,您也可以这样做new Carbon('today midnight'),然后可以使用所有的Carbon材质,例如->subDays(6)。参见carbon.nesbot.com
Christopher K.

关于32位限制:strtotimePHP文档指出:“对于64位版本的PHP,时间戳的有效范围实际上是无限的,因为64位可以代表任一方向大约2930亿年。” 因此,它仅适用于32位php。
Christopher K.

19

今天午夜。简单。

$stamp = mktime(0, 0, 0);

7

您正在计算最近的天体事件的时间,在该事件中,太阳已经从您的脚下直接经过,已经过调整以适应午后的当地惯例,并且还可能进行调整,以使人们下班回家后剩下足够的日光。其他政治考虑。

令人生畏的对吧?实际上,这是一个常见问题,但完整的答案取决于位置:

$zone = new \DateTimeZone('America/New_York'); // Or your own definition of “here”
$todayStart = new \DateTime('today midnight', $zone);
$timestamp = $todayStart->getTimestamp();

https://secure.php.net/manual/en/timezones.php列出了“此处”的可能定义。


喜欢strtotime('America/New_York today midnight');吗?- 3v4l.org/I85qD
hakre

5
$today_at_midnight = strtotime(date("Ymd"));

应该给你你想要的。

说明

我所做的是使用PHP的date函数获取今天的日期,而没有任何时间参考,然后将其传递给'string to time'函数,该函数将日期和时间转换为纪元时间戳。如果没有时间,则以当天的第一秒为准。

参考:日期函数:http : //php.net/manual/en/function.date.php

时间字符串:http : //us2.php.net/manual/en/function.strtotime.php


时间戳?那只是个约会。
wesside 2012年

OP是否要求特定格式?如果是这样,我很乐意修改我的帖子以返回他们想要的任何格式。
SamHuckaby,2012年

完全被忽略了strtotime(),头脑如此专注于日期功能。道歉。
wesside 2012年

2

以更客观的方式:

$today = new \DateTimeImmutable('today');

例:

 echo (new \DateTimeImmutable('today'))->format('Y-m-d H:i:s');
// will output: 2019-05-16 00:00:00

和:

echo (new \DateTimeImmutable())->format('Y-m-d H:i:s');
echo (new \DateTimeImmutable('now'))->format('Y-m-d H:i:s');
// will output: 2019-05-16 14:00:35

1
$timestamp = strtotime('today midnight');

是相同的

$timestamp = strtotime('today');

而且在您的服务器上的工作量要少一些。


0

$midnight = strtotime('midnight');有效
您也可以试试 strtotime('12am')strtotime('[input any time you wish to here. e.g noon, 6pm, 3pm, 8pm, etc]')。我跳过了今天午夜之前添加的内容,因为默认值是今天。


0

如果您使用的是Carbon,则可以执行以下操作。您也可以格式化此日期以设置ExpireHTTP标头。

Carbon::parse('tomorrow midnight')->format(Carbon::RFC7231_FORMAT)

0

2020年4月19日更新答案

我们可以简单地做到这一点:

$today = date('Y-m-d 00:00:00');


-1

function getTodaysTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const startOfDay = currentTimeStamp - (currentTimeStamp % 86400);
  return { startOfDay, endOfDay: startOfDay + 86400 - 1 };
}

// starts from sunday
function getThisWeeksTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const currentDay = new Date(currentTimeStamp * 1000);
  const startOfWeek = currentTimeStamp - (currentDay.getDay() * 86400) - (currentTimeStamp % 86400);
  return { startOfWeek, endOfWeek: startOfWeek + 7 * 86400 - 1 };
}


function getThisMonthsTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const currentDay = new Date(currentTimeStamp * 1000);
  const startOfMonth = currentTimeStamp - ((currentDay.getDate() - 1) * 86400) - (currentTimeStamp % 86400);
  const currentMonth = currentDay.getMonth() + 1;
  let daysInMonth = 0;
  if (currentMonth === 2) daysInMonth = 28;
  else if ([1, 3, 5, 7, 8, 10, 12].includes(currentMonth)) daysInMonth = 31;
  else daysInMonth = 30;
  return { startOfMonth, endOfMonth: startOfMonth + daysInMonth * 86400 - 1 };
}


console.log(getTodaysTimeStamp());
console.log(getThisWeeksTimeStamp());
console.log(getThisMonthsTimeStamp());


这个问题与PHP有关。这个答案是用JavaScript编写的
电动咖啡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.