NOW() function in PHP

PhpDatetimeTimeTimestamp

Php Problem Overview


Is there a PHP function that returns the date and time in the same format as the MySQL function NOW()?

I know how to do it using date(), but I am asking if there is a function only for this.

For example, to return:

2009-12-01 00:00:00

Php Solutions


Solution 1 - Php

You can use the date function:

date("Y-m-d H:i:s");

Solution 2 - Php

date('Y-m-d H:i:s')

Look here for more details: http://pl.php.net/manual/en/function.date.php

Solution 3 - Php

With PHP version >= 5.4 DateTime can do this:-

echo (new \DateTime())->format('Y-m-d H:i:s');

See it working.

Solution 4 - Php

Use this function:

function getDatetimeNow() {
    $tz_object = new DateTimeZone('Brazil/East');
    //date_default_timezone_set('Brazil/East');

    $datetime = new DateTime();
    $datetime->setTimezone($tz_object);
    return $datetime->format('Y\-m\-d\ h:i:s');
}

Solution 5 - Php

Short answer

$now = date_create()->format('Y-m-d H:i:s');

Read below for the long answer.




The mimicry of the MySQL NOW() function in PHP

Here is a list of ways in PHP that mimic the MySQL NOW() function.

// relative date
$now = date_create('now')->format('Y-m-d H:i:s'); // works in php 5.2 and higher  
$now = date_create()->format('Y-m-d H:i:s'); // also works in php 5.2
$now = new DateTime('now')->format('Y-m-d H:i:s'); // syntax error!!!
$now = (new DateTime('now'))->format('Y-m-d H:i:s'); // works in php 5.4 and higher   
$now = date('Y-m-d H:i:s'); // Slightly higher performance, but less usable for date/time manipulations

// From Unix timestamp
// Using date_create() with a Unix timestamp will give you a FALSE,  
// and if you try to invoke format() on a FALSE then you'll get a: 
//     Fatal error: Call to a member function format() on boolean 
// So if you work with Unix timestamps then you could use: date_create_from_format().
$unixTimeStamp = 1420070400; // 01/01/2015 00:00:00
$y2015 = date_create_from_format('U', $unixTimeStamp, timezone_open('Europe/Amsterdam'))->format('Y-m-d H:i:s');
$y2015 = date('Y-m-d H:i:s', $unixTimeStamp);

I think that date_create()->format('Y-m-d H:i:s') is the best way because this approach allows you to handle time/time-zone manipulations easier than date('Y-m-d H:i:s') and it works since php 5.2.


MySQL NOW() function

The MySQL function NOW() gives the dateTime value in this format: 'YYYY-MM-DD HH:MM:SS'. See here: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now.

An interesting fact is that it's possible to get the datetime format by running this query: SHOW VARIABLES LIKE 'd%e_format', the result could be something like this:

Variable_name 	  Value 	
date_format 	  %Y-%m-%d
datetime_format   %Y-%m-%d %H:%i:%s

The variables up here are read-only variables. So you can't change it.

I guess the MySQL NOW() function gets it's format from the datetime_format variable.




The advantages of date_create()->format() instead date() summary

The favorable facts of date_create('now')->format('Y-m-d H:i:s') over date('Y-m-d H:i:s') are:

  • easier to handle time manipulations
  • easier to handle timezones
  • o.o.p.

The disadvantages of date_create()->format() instead date()

The function date() has a slightly better performance than date_create()->format(). See benchmark test below.

$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $a = date_create('now')->format('Y-m-d H:i:s');
}
$end = time();                  
$elapsedTimeA = $end - $start;
 
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';
 
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $b = date('Y-m-d H:i:s');
}
$end = time();                   
$elapsedTimeB = $end - $start;
 
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 31
Case B, elapsed time in seconds: 14

The upper case shows that date() is faster. However, if we change the test scenario a bit, then outcome will be different. See below:

$start = time();
$dt = date_create('now');
for ($i = 0; $i <= 5000000; $i++) {
    $a = $dt->format('Y-m-d H:i:s');
}
$end = time();                  
$elapsedTimeA = $end - $start;
 
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';
 
$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $b = date('Y-m-d H:i:s');
}
$end = time();                   
$elapsedTimeB = $end - $start;
 
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 14
Case B, elapsed time in seconds: 15

The DateTime method: format() is faster here than date().




The advantages of date_create()->format() instead date() detailed

Read on for the detailed explanation.

easier to handle time manipulations

date_create() accepts a relative date/time format (like now, yesterday or +1 day) see this link, example:

$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 

date() accepts a relative date/time format as well, like this:

$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));
$tomorrow = date('Y-m-d H:i:s', (time() + 86400)); // 86400 seconds = 1 day

easier to handle timezones

When timezones matter then the usage of date_create()->format() makes a lot more sense then date() because date() uses the default time zone which is configured in php.ini at the date.timezone directive. Link: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

It is possible to change the timezone during run-time. Example:

date_default_timezone_set('Asia/Tokyo');.

The downside of that is that it will affect all date/time functions. This problem doesn't exists if you are using date_create()->format() in combination with timezone_open().

PHP supports major timezones. The funny thing is that it even supports the Arctic circle, and Antarctica. Have you ever heard about Longyearbyen? If not, then don't worry, neither did I until I read the official PHP documentation.

$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');

See a list of all supported timezones: http://php.net/manual/en/timezones.php.

o.o.p.

O.O.P. uses state-full Objects. So I prefer to think in this way:

// Create a DateTime Object. 
// Use the DateTime that applies for tomorrow.
// Give me the datetime in format 'Y-m-d H:i:s'
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 

Then to think in this way:

// Give me a date time string in format 'Y-m-d H:i:s', 
// use strtotime() to calculate the Unix timestamp that applies for tomorrow.
$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));

Therefore I would say that the date_create()->format() approach is more readable to me then date().




date_create() VS new DateTime()

The favorable facts of date_create() over new DateTime() are:

  • Namespaces

Namespaces

If you work in a namespace and want to initialise a DateTime object with the new keyword, then you have to do it like this:

namespace my_namespace;

// The backslash must be used if you are in a namespace.
// Forgetting about the backslash results in a fatal error.
$dt = new \DateTime();

There is nothing wrong with this, but the downside of the above is that people forget sporadically about the backslash. By using the date_create() constructor function you don't have to worry about namespaces.

$dt = date_create(); // in or not in a namespace it works in both situations




Example of date_create()->format()

I use this approach for my projects if I have to fill an array. Like this:

$array = array(
    'name' => 'John',
    'date_time' => date_create('now')->format('Y-m-d H:i:s'), // uses the default timezone
    'date_time_japan' => date_create('now', timezone_open('Asia/Tokyo'))->format('Y-m-d H:i:s'),
);

Solution 6 - Php

Try this:

date("Y-m-d H:i:s");

Solution 7 - Php

I was looking for the same answer, and I have come up with this solution for PHP 5.3 or later:

$dtz = new DateTimeZone("Europe/Madrid"); //Your timezone
$now = new DateTime(date("Y-m-d"), $dtz);
echo $now->format("Y-m-d H:i:s");

Solution 8 - Php

One more answer I find easy to use:

echo date('c');

// 2015-07-27T00:00:00+02:00

This is ISO 8601 date (added in PHP 5) which MySQL uses

Edit

MySQL 5.7 do not allow timezone in the datetime by default. You can disable the error with SQL_MODE=ALLOW_INVALID_DATES. See the answer here for more details: https://stackoverflow.com/a/35944059/2103434. But that also means that the timezone will be lost when saving to the database!

By default MySQL uses the system's timezone, and as long as PHP uses the same timezone you should be okay. In my case CET / UTC+2.

That means that if I insert 2015-07-27T00:00:00+02:00 to the database, only 2015-07-27T00:00:00 will be stored (but that is the correct local time!).

When I load the time back in to PHP,

$importedDate = new \DateTime('2015-07-27T00:00:00')

it will automatically assume it's +02:00 timezone since it's the default. Printing this will be correct again:

echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00

To be safe, always use UTC on the server, specify it in MySQL and PHP, and then only convert it to your user's locale when displaying the date:

date_default_timezone_set('UTC');
$importedDate = new \DateTime('2015-07-27T00:00:00+02:00');
echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00

$importedDate->setTimezone(new \DateTimeZone("America/New_York"));
echo $importedDate->format('c');
// 2015-07-26T18:00:00-04:00

Solution 9 - Php

MySQL function NOW() returns the current timestamp. The only way I found for PHP is using the following code.

$curr_timestamp = date('Y-m-d H:i:s');

Solution 10 - Php

Use strftime:

strftime("%F %T");
  • %F is the same as %Y-%m-%d.

  • %T is the same as %H:%M:%S.

Here's a demo on ideone.

Solution 11 - Php

Or you can use DateTime constants:

echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00

Here's the list of them:

ATOM = "Y-m-d\TH:i:sP" ;               // -> 2005-08-15T15:52:01+00:00
COOKIE = "l, d-M-Y H:i:s T" ;          // -> Monday, 15-Aug-2005 15:52:01 UTC
ISO8601 = "Y-m-d\TH:i:sO" ;            // -> 2005-08-15T15:52:01+0000
RFC822 = "D, d M y H:i:s O" ;          // -> Mon, 15 Aug 05 15:52:01 +0000
RFC850 = "l, d-M-y H:i:s T" ;          // -> Monday, 15-Aug-05 15:52:01 UTC
RFC1036 = "D, d M y H:i:s O" ;         // -> Mon, 15 Aug 05 15:52:01 +0000
RFC1123 = "D, d M Y H:i:s O" ;         // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC2822 = "D, d M Y H:i:s O" ;         // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC3339 = "Y-m-d\TH:i:sP" ;            // -> 2005-08-15T15:52:01+00:00 ( == ATOM)
RFC3339_EXTENDED = "Y-m-d\TH:i:s.vP" ; // -> 2005-08-15T15:52:01.000+00:00
RSS = "D, d M Y H:i:s O" ;             // -> Mon, 15 Aug 2005 15:52:01 +0000
W3C = "Y-m-d\TH:i:sP" ;                // -> 2005-08-15T15:52:01+00:00

For debugging I prefer a shorter one though (3v4l.org):

echo date('ymd\THisP'); // 180614T120708+02:00

Solution 12 - Php

I like the solution posted by user1786647, and I've updated it a little to change the timezone to a function argument and add optional support for passing either a Unix time or datetime string to use for the returned datestamp.

It also includes a fallback for "setTimestamp" for users running version lower than PHP 5.3:

function DateStamp($strDateTime = null, $strTimeZone = "Europe/London") {
    $objTimeZone = new DateTimeZone($strTimeZone);

    $objDateTime = new DateTime();
    $objDateTime->setTimezone($objTimeZone);

    if (!empty($strDateTime)) {
        $fltUnixTime = (is_string($strDateTime)) ? strtotime($strDateTime) : $strDateTime;

        if (method_exists($objDateTime, "setTimestamp")) {
            $objDateTime->setTimestamp($fltUnixTime);
        }
        else {
            $arrDate = getdate($fltUnixTime);
            $objDateTime->setDate($arrDate['year'], $arrDate['mon'], $arrDate['mday']);
            $objDateTime->setTime($arrDate['hours'], $arrDate['minutes'], $arrDate['seconds']);
        }
    }
    return $objDateTime->format("Y-m-d H:i:s");
}

Solution 13 - Php

You can use the PHP date function with the correct format as the parameter,

echo date("Y-m-d H:i:s");

Solution 14 - Php

My answer is superfluous, but if you are OCD, visually oriented and you just have to see that now keyword in your code, use:

date( 'Y-m-d H:i:s', strtotime( 'now' ) );

Solution 15 - Php

There is no built-in PHP now() function, but you can do it using date().

Example

function now() {
    return date('Y-m-d H:i:s');
}

You can use date_default_timezone_set() if you need to change timezone.

Otherwise you can make use of Carbon - A simple PHP API extension for DateTime.

Solution 16 - Php

shortly

echo date('Y-m-d H:i:s');

php advanced now class extra addMinute addYear as such addHour etc ...

<?php /** @noinspection PhpUnhandledExceptionInspection */

/**
 * Class Now
 * @author  dılo sürücü <berxudar@gmail.com>
 */
class Now
{

    /**
     * @var DateTime
     */
    private $dateTime;

    /**
     * Now constructor.
     * @throws Exception
     */
    public function __construct()
    {
        $this->dateTime = new DateTime('now');
    }


    /**
     * @param int $year
     * @return Now
     * @throws Exception
     * @noinspection PhpUnused
     */
    public function addYear(int $year): self
    {
        $this->dateTime->add(new DateInterval('P' . $year . 'Y'));

        return $this;
    }

    /**
     * @noinspection PhpUnused
     * @param int $month
     * @return Now
     * @throws Exception
     * @noinspection PhpUnused
     */
    public function addMonth(int $month):self 
    {
        $this->dateTime->add(new DateInterval('P' . $month . 'M'));

        return $this;
    }

    /**
     * @param int $day
     * @return $this
     * @throws Exception
     */
    public function addDay(int $day): self
    {
        $this->dateTime->add(new DateInterval('P' . $day . 'D'));
        return $this;
    }

    /**
     * @noinspection PhpUnused
     * @param int $week
     * @return $this
     * @throws Exception
     */
    public function addWeek(int $week): self
    {
        return $this->addDay($week * 7);
    }

    /**
     * @noinspection PhpUnused
     * @param int $second
     * @return $this
     * @throws Exception
     */
    public function addSecond(int $second): self
    {
        $this->dateTime->add(new DateInterval('PT' . $second . 'S'));
        return $this;
    }

    /**
     * @param int $minute
     * @return $this
     * @throws Exception
     */
    public function addMinute(int $minute): self
    {
        $this->dateTime->add(new DateInterval('PT' . $minute . 'M'));
        return $this;
    }

    /**
     * @param int $hour
     * @return $this
     * @throws Exception
     */
    public function addHour(int $hour): self
    {
        $this->dateTime->add(new DateInterval('PT' . $hour . 'H'));
        return $this;
    }


    /**
     * @return string
     */
    public function get(): string
    {
        return $this->dateTime->format('Y-m-d H:i:s');
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->get();
    }

}


/**
 * @return Now
 * @throws Exception
 */
function now()
{
    return new Now();

}





using

  echo now(); //2020-03-10 22:10


echo now()->addDay(1); //2020-03-11 22:10


echo now()->addDay(1)->addHour(1); // //2020-03-11 23:10


echo now()->addDay(1)->addHour(1)->addMinute(30); // //2020-03-11 23:40


echo now()->addDay(1)->addHour(1)->addMinute(30)->addSecond(10); // //2020-03-11 23:50

//or u can use get method for example

echo now()->addDay(1)->addHour(1)->addMinute(30)->get(); // //2020-03-11 23:40

Solution 17 - Php

In PHP the logic equivalent of the MySQL's function now() is time().

But time() return a Unix timestamp that is different from a MySQL DATETIME.

So you must convert the Unix timestamp returned from time() in the MySQL format.

You do it with: date("Y-m-d H:i:s");

But where is time() in the date() function? It's the second parameter: infact you should provide to date() a timestamp as second parameter, but if it is omissed it is defaulted to time().

This is the most complete answer I can imagine.

Greetings.

Solution 18 - Php

If you want to get time now including AM / PM

<?php 
	$time_now = date("Y-m-d h:i:s a");
	echo $time_now;
?>

It outputs 2020-05-01 05:45:28 pm

or

<?php 
	$time_now = date("Y-m-d h:i:s A");
	echo $time_now;
?>

It outputs 2020-05-01 05:45:28 PM

Solution 19 - Php

You might find this helpful

new \DateTime()

Solution 20 - Php

The PHP equivalent is time(): http://php.net/manual/en/function.time.php

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
QuestionMoeAmineView Question on Stackoverflow
Solution 1 - PhptroelsknView Answer on Stackoverflow
Solution 2 - PhphszView Answer on Stackoverflow
Solution 3 - PhpvascowhiteView Answer on Stackoverflow
Solution 4 - Phpuser1786647View Answer on Stackoverflow
Solution 5 - PhpJulianView Answer on Stackoverflow
Solution 6 - PhpstreetparadeView Answer on Stackoverflow
Solution 7 - PhpsantiView Answer on Stackoverflow
Solution 8 - PhpRichard87View Answer on Stackoverflow
Solution 9 - PhpShriganesh ShintreView Answer on Stackoverflow
Solution 10 - Phpuser669677View Answer on Stackoverflow
Solution 11 - PhpCPHPythonView Answer on Stackoverflow
Solution 12 - PhpSethView Answer on Stackoverflow
Solution 13 - PhpSomView Answer on Stackoverflow
Solution 14 - PhpMacView Answer on Stackoverflow
Solution 15 - PhpRAZIULView Answer on Stackoverflow
Solution 16 - Phpdılo sürücüView Answer on Stackoverflow
Solution 17 - PhpAdriano G. V. EspositoView Answer on Stackoverflow
Solution 18 - PhpJosephView Answer on Stackoverflow
Solution 19 - PhpSzymon ZachariaszView Answer on Stackoverflow
Solution 20 - PhpMarco MarsalaView Answer on Stackoverflow