NOW() function in PHP
Solution 1
You can use the date function:
date("Y-m-d H:i:s");
Solution 2
date('Y-m-d H:i:s')
Look here for more details: http://pl.php.net/manual/en/function.date.php
Solution 3
With PHP version >= 5.4 DateTime can do this:-
echo (new \DateTime())->format('Y-m-d H:i:s');
Solution 4
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
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'),
);
Comments
-
MoeAmine about 3 years
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