Getting a timestamp for today at midnight?

PhpTimeTimestamp

Php Problem Overview


How would I go about getting a timestamp in php for today at midnight. Say it's monday 5PM and I want the Timestamp for Monday(today) at midnight(12 am) which already has happened.

Thank you

Php Solutions


Solution 1 - Php

$timestamp = strtotime('today midnight');

or via a DateTime:

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

and then perhaps immutable:

$midnight = new DateTimeImmutable('today midnight');
// or: $midnight = date_create_immutable('today midnight');
$timestampOfMidnight = $midnight->getTimestamp();
  1. That is in the default timezone.
  2. Spoiler: just "midnight" or or just "today" return the same.
  3. Add a timezone, e.g. "UTC today", to have it, always.
  4. Spoiler #2: UTC greeting style: "midnightZ"
  5. History: midnight is since PHP 5.1.2 (Jan 2006), today since PHP 4.3.1 (Feb 2003)

More examples:

given the time UTC 2020-01-01 00:00:00:

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

when calling strtotime($), results are:

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

Online Demo: https://3v4l.org/KWFJl


PHP Documentation:

  • On the Relative Formats page, see the Day-based Notations table. These formats are for strtotime(), DateTime and date_create().

  • You might want to take a look what more PHP has to offer: https://php.net/datetime - the entry page to date-time related functions and objects in PHP with links to other, date-time related extensions.


NOTE: While "midnight" being technically between two days, here it is "today" (start of day) with PHPs' strtotime.

Discussion:

In so far, the answer strtotime("today midnight") or strtotime("midnight today") is a complete and well sounding answer for PHP, it may appear a bit verbose as strtotime("midnight") and strtotime("today") return the same result.

But even being more verbose not always instantly answers the question if it is about the Midnight for start of day or the Midnight for end of day even today is given as context. We may think about the start of day when reading "today midnight", but this is an assumption and not precise and perhaps can't be. Wikipedia:

> Though there is no global unanimity on the issue, most often midnight is considered the start of a new day and is associated with the hour 00:00.

Compare with this programming question:

  • Given midnight is a time transition
  • When asking for a single UNIX timestamp
  • Then there is no answer

(it would be between two UNIX timestamps, so you would take two timestamps and describe what the two mean and this would not answer the question as it asks for a single timestamp).

This is not easy to completely resolve because of this mismatch and by how UNIX Time references date/time.

Lets take the well known, digital 24-hour clock with hours and minutes and express midnight (is it more precise?):

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

or for end of day:

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

(NOTE: shown as start of next day)

Or the 12-hour clock, it can also be used to give the UNIX Timestamp of today at midnight:

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

(NOTE: the "12 midnight" notation is not supported by strtotime())

The confusion that can result of a transition time like Midnight to map on a clock may even become more visible with the 12-hour clock as similar to "midnight" the midday (not available in PHP as a relative date/time format but "noon") is technically between again (now between two full dates at noon, or between the first and the second half of a day).

As this adds up, the code is likely not well received over a 24 hour clock or just writing out "today midnight".

Your mileage may vary.

This is kind of aligned with clock time. From Wikipedia Midnight:

> "Midnight is the transition time from one day to the next – the moment when the date changes, on the local official clock time for any particular jurisdiction. By clock time, midnight is the opposite of noon, differing from it by 12 hours. [bold by me]"

and from the Wikipedia 12-hour clock:

> "It is not always clear what times "12:00 a.m." and "12:00 p.m." denote. From the Latin words meridies (midday), ante (before) and post (after), the term ante meridiem (a.m.) means before midday and post meridiem (p.m.) means after midday. Since "noon" (midday, meridies (m.)) is neither before nor after itself, the terms a.m. and p.m. do not apply. Although "12 m." was suggested as a way to indicate noon, this is seldom done and also does not resolve the question of how to indicate midnight."

Solution 2 - Php

I think that you should use the new PHP DateTime object as it has no issues doing dates beyond the 32 bit restrictions that strtotime() has. Here's an example of how you would get today's date at midnight.

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

Or if you're using PHP 5.4 or later you can do it this way:

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

Then you can use the echo $today->format('Y-m-d'); to get the format you want your object output as.

PHP DateTime Object

Solution 3 - Php

Today at midnight. Easy.

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

Solution 4 - Php

You are looking to calculate the time of the most recent celestial event where the sun has passed directly below your feet, adjusted for local conventions of marking high noon and also potentially adjusting so that people have enough daylight left after returning home from work, and for other political considerations.

Daunting right? Actually this is a common problem but the complete answer is location-dependent:

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

Potential definitions of “here” are listed at https://secure.php.net/manual/en/timezones.php

Solution 5 - Php

Updated Answer in 19 April, 2020

Simply we can do this:

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

Solution 6 - Php

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

should give you what you're after.

explanation

What I did was use PHP's date function to get today's date without any references to time, and then pass it to the 'string to time' function which converts a date and time to a epoch timestamp. If it doesn't get a time, it assumes the first second of that day.

References: Date Function: http://php.net/manual/en/function.date.php

String To Time: http://us2.php.net/manual/en/function.strtotime.php

Solution 7 - Php

$timestamp = strtotime('today midnight');

is the same as

$timestamp = strtotime('today');

and it's a little less work on your server.

Solution 8 - Php

In more object way:

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

example:

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

and:

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

Solution 9 - Php

$midnight = strtotime('midnight'); is valid
You can also try out strtotime('12am') or strtotime('[input any time you wish to here. e.g noon, 6pm, 3pm, 8pm, etc]'). I skipped adding today before midnight because the default is today.

Solution 10 - Php

If you are using Carbon you can do the following. You could also format this date to set an Expire HTTP Header.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1701398View Question on Stackoverflow
Solution 1 - PhphakreView Answer on Stackoverflow
Solution 2 - PhpJoe MeyerView Answer on Stackoverflow
Solution 3 - PhpbearcatView Answer on Stackoverflow
Solution 4 - PhpWilliam EntrikenView Answer on Stackoverflow
Solution 5 - PhpaspileView Answer on Stackoverflow
Solution 6 - PhpSamHuckabyView Answer on Stackoverflow
Solution 7 - PhpCaseView Answer on Stackoverflow
Solution 8 - PhpJan GaltowskiView Answer on Stackoverflow
Solution 9 - PhpVictor MbamaraView Answer on Stackoverflow
Solution 10 - PhpnowoxView Answer on Stackoverflow