NOW() function in PHP

前端 未结 20 1471
遥遥无期
遥遥无期 2020-11-28 17:26

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(), b

相关标签:
20条回答
  • 2020-11-28 18:08

    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
    
    0 讨论(0)
  • 2020-11-28 18:09

    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'),
    );
    
    0 讨论(0)
提交回复
热议问题