141

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

谢谢

4

10 回答 10

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

或通过DateTime

$date = new DateTime('today midnight');
// or: $date = date_create('today midnight');
$timestamp = $date->getTimestamp();

然后也许是不可变的:

$midnight = new DateTimeImmutable('today midnight');
// or: $midnight = date_create_immutable('today midnight');
$timestampOfMidnight = $midnight->getTimestamp();
  1. 那是在默认时区
  2. 剧透:只是“ midnight”或或只是“ today”返回相同。
  3. 添加时区,例如“ UTC today”,始终拥有它。
  4. 剧透 #2:UTC 问候风格:“ midnightZ
  5. 历史:midnightPHP 5.1.2(2006 年 1 月)以来,todayPHP 4.3.1(2003 年 2 月)以来

更多示例:

给定时间UTC 2020-01-01 00:00:00

UTC time is ............: [red   ] 1577836800

调用时strtotime($),结果为:

today midnight .........: [pink  ] 1577833200
midnight ...............: [pink  ] 1577833200
today ..................: [pink  ] 1577833200
tomorrow ...............: [green ] 1577919600
UTC today ..............: [red   ] 1577836800
today Z ................: [red   ] 1577836800
Asia/Shanghai today ....: [lime  ] 1577808000
Asia/Shanghai ..........: [blue  ] 1577811600
HKST today .............: [copper] 1577804400

在线演示:https ://3v4l.org/KWFJl


PHP 文档:

  • 相对格式页面上,查看基于日的表示法表。这些格式适用strtotime()DateTimedate_create()

  • 您可能想看看 PHP 提供的更多功能:https ://php.net/datetime - PHP 中与日期时间相关的函数和对象的入口页面,其中包含指向其他与日期时间相关的扩展的链接。


注意:虽然“ midnight”在技术上介于两天之间,但这里是“ today”(一天的开始)与 PHPs' strtotime

讨论:

到目前为止,答案strtotime("today midnight")orstrtotime("midnight today")是一个完整且听起来不错的 PHP 答案,它可能看起来有点冗长,strtotime("midnight")strtotime("today")返回相同的结果。

但是,即使是更加冗长,也并不总是能立即回答这个问题,如果它是关于一天开始的 午夜或一天结束的午夜,即使在今天也是作为上下文给出的。阅读“今天午夜”时,我们可能会想到一天的开始,但这是一个假设,并不精确,也许不可能。维基百科

尽管在这个问题上没有全球一致意见,但午夜通常被认为是新一天的开始,并与 00:00 小时相关联。

与此编程问题进行比较:

  • 鉴于午夜是一个时间转换
  • 要求单个 UNIX 时间戳时
  • 然后没有答案

(它将在两个 UNIX 时间戳之间,因此您将获取两个时间戳并描述两者的含义,这不会回答问题,因为它要求单个时间戳)。

由于这种不匹配以及 UNIX 时间如何引用日期/时间,这不容易完全解决。

让我们以众所周知的带有小时和分钟的数字 24 小时时钟来表示午夜(是否更精确?):

$midnight = strtotime("today 00:00");

或结束一天:

$midnight = strtotime("today 24:00");

(注:显示为第二天开始)

或者 12 小时制,它也可以用来给出 今天午夜的UNIX 时间戳

$midnight = strtotime("12:00 a.m.");

(注意:不支持“午夜 12 点”strtotime()表示法)

午夜这样的过渡时间映射到时钟上可能导致的混乱甚至可能在 12 小时制时钟中变得更加明显,类似于“ ”中午(在 PHP 中不可用作为相对日期/时间格式,但“ ”)从技术上讲,介于两者之间现在在中午的两个完整日期之间,或在一天的前半天和后半天之间)。midnightnoon

这样一来,代码可能不会在 24 小时内得到很好的接受,或者只是写出“ today midnight”。

你的旅费可能会改变。

这有点与时钟时间一致。来自维基百科午夜

“午夜是从一天到下一天的过渡时间——日期变化的时刻,在任何特定司法管辖区的当地官方时钟时间。按时钟时间,午夜与中午相反,相差 12 小时。[由我粗体]"

并来自维基百科 12 小时制

“并不总是很清楚“12:00 am”和“12:00 pm”表示什么时间。从拉丁词meridies(中午),ante(之前)和post(之后),术语ante meridiem(上午)表示before meridiem (pm) 表示中午之后。由于“noon”(midday, meridiem (m.))既不在其之前也不在其之后,因此术语 am 和 pm 不适用。尽管“12 m.”被建议为一种表示中午的方法,这种做法很少做,也不能解决如何表示午夜的问题。”

于 2012-10-29T21:20:04.863 回答
80

我认为您应该使用新的 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 日期时间对象

于 2014-03-20T14:16:07.833 回答
22

今天午夜。简单的。

$stamp = mktime(0, 0, 0);
于 2013-09-27T13:54:10.757 回答
8

您正在计算最近一次天体事件的时间,即太阳直接从您的脚下经过,并根据当地的正午标记惯例进行调整,并可能进行调整,以便人们下班回家后有足够的日光,以及其他政治考虑。

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

$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

于 2015-12-29T15:19:06.270 回答
6

2020 年 4 月 19 日更新的答案

我们可以这样做:

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

于 2020-04-19T13:56:02.873 回答
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

于 2012-10-29T21:18:54.797 回答
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
于 2019-05-16T12:06:55.160 回答
2
$timestamp = strtotime('today midnight');

是相同的

$timestamp = strtotime('today');

而且你的服务器上的工作少了一点。

于 2018-12-03T21:45:19.417 回答
0

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

于 2018-05-30T13:44:37.427 回答
0

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

Carbon::parse('tomorrow midnight')->format(Carbon::RFC7231_FORMAT)
于 2019-06-27T13:53:08.933 回答