【问题标题】:Getting a timestamp for today at midnight?在午夜获取今天的时间戳?
【发布时间】:2012-10-19 06:01:15
【问题描述】:

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

谢谢

【问题讨论】:

  • 午夜不是上午也不是下午。同样从技术上讲,不存在午夜的时间戳。
  • @hakre 我不同意你的观点。午夜是上午,无论时间戳采用何种格式,午夜都有一个值。
  • 如果今天或明天考虑 00:00:00。从技术上讲,今天的午夜几乎一直在我们身后。您或多或少想要 23:59:59 的“今晚”或 00:00:00“今天的午夜,即明天”。
  • 00:00:00 的时间将是今天的午夜,因为无论需要多少时间才能到达已经发生的 00:00:00。今晚是 23:59:59。如果你以今天的话来说。午夜是上午。
  • 00:00 是一天开始的午夜,24:00 是一天结束的午夜。然而,为简单起见,大多数数字时钟会跳过 24:00 - 宣布午夜是新一天的开始。 IE。 2 月 8 日 24:00 和 2 月 9 日 00:00 实际上是同一时间点。

标签: php time timestamp


【解决方案1】:
$timestamp = strtotime('today midnight');

或通过日期时间

$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. 那是在default timezone
  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 文档:

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

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


注意:虽然“midnight”在技术上两天之间,但这里是“today”(一天的开始)和 PHP 的 strtotime .

讨论:

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

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

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

与这个编程问题比较:

  • 鉴于午夜是一个时间转换
  • 请求单个 UNIX 时间戳时
  • 那就没有答案了

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

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

让我们用众所周知的数字 24 小时时钟来表示小时和分钟并表示午夜(更精确吗?):

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

或结束一天:

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

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

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

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

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

过渡时间(如 Midnight)映射到时钟上可能会导致混淆,使用类似于“@987654358”的 12 小时制时钟甚至会变得更加明显@" midday(在 PHP 中不能作为相对日期/时间格式,但“noon”)在技术上介于 again 之间(现在在中午的两个完整日期之间,或在前半天和后半天之间)。

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

您的里程可能会有所不同。

这有点与时钟时间一致。来自Wikipedia Midnight

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

来自Wikipedia 12-hour clock

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

【讨论】:

  • @SamHuckaby:更简单:$timestamp = strtotime('today'); 是午夜。但是上面的 pssst 作为问题的答案看起来更酷;)
  • 我实际上需要从今天开始和今天午夜开始。我怎样才能找到今天的开始,我的意思是 00:00:00
  • @AlwinAugustin:你应该考虑改变你的措辞。午夜在技术上介于两天之间。所以有些“今天不再”。另外:今天的午夜(根据定义)是(就在之前)今天的开始。您的意思可能是今天中午之后的下一个午夜
  • 请记住,这将产生您的 PHP 服务器时区的午夜,不是 UTC+0!要获得 UTC+0,您可以使用 strtotime('today+00:00')
  • @mae nice,甚至还有其他方法,例如today+0today ZUTC todayAsia/Shanghai todayHKST today。我很难在 PHP 文档中找到这个,3v4l.org 链接到目前为止还没有:3v4l.org/amfGc
【解决方案2】:

我认为您应该使用新的 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 Object

【讨论】:

  • 我也更喜欢使用新的 DateTime 对象。如果将此答案与@hakr 结合起来,您将得到:new DateTime('today midnight'),这使得意图更加明确(但这当然是个人喜好问题)。
  • 我正在做 ORM SQL 工作,我不得不使用 DateTime 对象进行比较。这正是我一直在寻找的。 +1
  • 可能是$today = new DateTime('today')
  • 如果您使用继承自 DateTime 的 Carbon,也很有用。因此,您也可以使用 new Carbon('today midnight'),然后您可以使用所有 Carbon 的东西,例如 ->subDays(6)。见carbon.nesbot.com
  • 关于 32 位限制:PHP docu for strtotime states:“对于 64 位版本的 PHP,时间戳的有效范围实际上是无限的,因为 64 位在任一方向上可以表示大约 2930 亿年。”所以它只适用于32位的php。
【解决方案3】:

今天午夜。很简单。

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

【讨论】:

    【解决方案4】:

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

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

    $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
    【解决方案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

    【讨论】:

    • 时间戳?这只是一个约会。
    • OP 是否要求特定格式?如果是这样,我很乐意修改我的帖子以返回他们想要的任何格式。
    • 完全忽略了strtotime(),脑子里太专注于日期功能了。道歉。
    【解决方案6】:

    2020 年 4 月 19 日更新答案

    我们可以这样做:

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

    【讨论】:

      【解决方案7】:
      $timestamp = strtotime('today midnight');
      

      相同
      $timestamp = strtotime('today');
      

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

      【讨论】:

        【解决方案8】:

        以更客观的方式:

        $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
        

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-09-30
              • 2012-03-31
              • 2011-03-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-23
              相关资源
              最近更新 更多