569

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
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
MoeAmine
  • 5,976
  • 2
  • 18
  • 21

20 Answers20

1202

You can use the date function:

date("Y-m-d H:i:s");
Pikamander2
  • 7,332
  • 3
  • 48
  • 69
troelskn
  • 115,121
  • 27
  • 131
  • 155
175
date('Y-m-d H:i:s')

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

Giacomo1968
  • 25,759
  • 11
  • 71
  • 103
hsz
  • 148,279
  • 62
  • 259
  • 315
  • 11
    I'd like to emphasize how both You and @troelskn sent the same answer on January the 3rd of year 2010. at 17:08, but he still got ~800 upvotes more. Your answer submission was probably seconds apart from his. :) Thank You for writing it anyways :D – Aleksandar May 29 '19 at 08:50
  • 4
    9 seconds later (visible if you hover the "answered" labeled) – Grzegorz Oledzki Mar 12 '20 at 09:22
  • It prints seconds as three digits, i.e. `2022-11-30 12:00:250` – Anton Duzenko Nov 30 '22 at 11:01
123

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

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

See it working.

vascowhite
  • 18,120
  • 9
  • 61
  • 77
  • 4
    nice idea wrapping the constructor and formatting it right the way. – acme Jun 17 '13 at 10:03
  • at last php started to copy from delphi and c# :) – Erçin Dedeoğlu Nov 01 '14 at 10:04
  • 1
    this may be nice, but does not answer the question at all, it is not easier nor faster to do it this way – Asped Nov 16 '14 at 14:11
  • 15
    @Asped In what way does it not answer the question? It is a PHP function that "returns the date & time in the same format as the MySQL function NOW()", which is precisely the question. – vascowhite Jan 20 '15 at 10:41
  • @vascowhite - the question was if there is a specific function for this one purpose. so the answer is NO. all the other possibilities listed here may be working and yours is also nice, but does not help, as the guy asking already knew a way how to do it, but wanted an easier, single-purpose function, which yours is not :) – Asped Jan 22 '15 at 11:24
  • 1
    Asped, none of the other answers answered the question either. The chap posting the quesiton was already aware of the date() function, and they just repeated that. At least this answer brings something new to the table. – Relaxing In Cyprus Feb 02 '15 at 11:24
  • @pendrive No, because class member access on instantiation (e.g. (new foo)->bar()) support was introduced in 5.4. See the [release notes](http://php.net/ChangeLog-5.php#5.4.0). – vascowhite Apr 20 '15 at 05:03
  • Oh your right, did not think about instantiation, thought its about DateTime itself – madz Apr 20 '15 at 16:59
  • replace echo with $variable = and this was exactly what I needed – Bruce Sep 24 '16 at 06:12
  • is this better than `Date('Y-m-d H:i:s')` ? – Abdul Rehman Apr 17 '17 at 05:40
  • I was able to use your solution to solve the "datetime now" issue that I was grappling with. I had to, however, remove "\" before "DateTime()", such that it became... "(new DateTime())->format('Y-m-d H:i:s');" Hope this helps. Thank you! Peace. – masarapmabuhay Nov 14 '17 at 08:18
  • @masarapmabuhay Sounds like you're using an outdated version of PHP then. I'm glad my answer was useful to you. – vascowhite Nov 14 '17 at 14:03
  • DateTime is highly suggested for compatibility of syntax when using other supported features of the class (which is common). This helps improve the overall architecture of your code. – tfont Jan 21 '19 at 13:26
43

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');
}
user1786647
  • 594
  • 4
  • 6
41

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.




Advantages of using 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:

  • O.O.P.
  • easier to handle time manipulations
  • easier to handle timezones

Disadvanteages of using date_create()->format() instead date() summary

  • date() performs slightly better



Advantages of using date_create()->format() instead date() detailed

Read on for the detailed explanation.

O.O.P.

The function date_create() is a constructor function for the DateTime object. The documentation of that Object gives the programmer a quick view that describes the possibilities. Documentation: https://www.php.net/manual/en/class.datetime.php

The function date() just gives you a string.

My taste for usability lies in O.O.P.

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. Does it matter? Well... yes if you run an international e-commerce platform and do something bound to local time, for example: calculate delivery date-time.

$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.

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



Disadvantages of using date_create()->format() instead date()

The function date() has a slightly better performance than date_create()->format(). However, it's only visible if you would instantiate DateTime millions of times. Which might never happen in a real-life situation. However, here is the benchmark test:

$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 date_create(), 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 date(), elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case date_create(), elapsed time in seconds: 31
Case date(), elapsed time in seconds: 14



Examples 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'),
);
Julian
  • 4,396
  • 5
  • 39
  • 51
  • Noting that `create_date` accepts timezone: `create_date('now', new DateTimeZone('Europe/Athens'))` - https://www.php.net/manual/en/function.date-create.php – Wtower Apr 28 '23 at 15:13
28

Try this:

date("Y-m-d H:i:s");
Giacomo1968
  • 25,759
  • 11
  • 71
  • 103
streetparade
  • 32,000
  • 37
  • 101
  • 123
21

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");
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
santi
  • 552
  • 8
  • 19
19

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
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Richard87
  • 1,592
  • 3
  • 16
  • 29
16

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');
apaderno
  • 28,547
  • 16
  • 75
  • 90
Shriganesh Shintre
  • 2,428
  • 3
  • 17
  • 16
15

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.

Danny Beckett
  • 20,529
  • 24
  • 107
  • 134
11

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
CPHPython
  • 12,379
  • 5
  • 59
  • 71
  • Actually, it's `DateTimeInterface`, not `DateTime` – Anton Duzenko Nov 30 '22 at 11:06
  • @AntonDuzenko [DateTime class](https://www.php.net/manual/en/class.datetime.php) also implements _W3C_ and `DateTimeInterface:W3C` is only supported from v^8.0.1 ([online eval](https://3v4l.org/NQjoT)), unlike `DateTime::W3C` which supports below v8.0.0 until v5.4.0 ([eval](https://3v4l.org/8Ll5X)). – CPHPython Nov 30 '22 at 14:35
  • Not v8, v7 also has it – Anton Duzenko Nov 30 '22 at 20:53
  • 1
    @AntonDuzenko not exactly, in [eval](https://3v4l.org/NQjoT#v7.2.0) below version 7.2.0 `DateTimeInterface:W3C` triggers a fatal error: "Undefined class constant 'W3C"... Since `DateTime::W3C` is not going to be deprecated, developers that work with multiple sites might just use this instead. – CPHPython Dec 06 '22 at 10:43
6

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");
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Seth
  • 121
  • 2
  • 2
6

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

echo date("Y-m-d H:i:s");
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Som
  • 1,467
  • 13
  • 11
5

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' ) );
Mac
  • 1,432
  • 21
  • 27
1

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
RAZIUL
  • 128
  • 2
  • 8
1

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
dılo sürücü
  • 3,821
  • 1
  • 26
  • 28
  • Why would anyone need an entire class for something that can be completely satisfied in one line of code?!? If anything in this TLDR is of value, it is the right answer to the wrong question. – mickmackusa Mar 12 '20 at 10:53
  • because now is object everytime – dılo sürücü Mar 12 '20 at 11:00
  • The OP has only asked for a specific formatted date string. Nothing more. No date/time manipulations. This is the right answer to the wrong question. – mickmackusa Mar 12 '20 at 11:10
  • 1
    Your edit has copied the suggested solution from 3 of the top 5 answers on this page. You are contributing to page bloat (redundant content and out-of-scope advice) and this is not good for Stackoverflow. – mickmackusa Mar 13 '20 at 22:16
1

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.

0

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

Joseph
  • 789
  • 1
  • 9
  • 23
0

You might find this helpful

new \DateTime()
  • This ten year old question already had a number of answers that included this same code. What is new and different about this answer? Code only answers can almost always be improved by adding explanation of how and why they work. – Jason Aller Aug 18 '20 at 18:00
  • This is nice to see if you're looking for the OO method of defining DateTime. Thanks Szymon – Jordan Casey Feb 08 '21 at 20:55
-1

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

Marco Marsala
  • 2,332
  • 5
  • 25
  • 39
  • 3
    Wrong answer! `time() Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).` – Daniel R. Mar 17 '19 at 20:58