ЗАРАЗ () функція в PHP


479

Чи є функція PHP, яка повертає дату та час у тому ж форматі, що і функція MySQL NOW()?

Я знаю, як це зробити за допомогою date() , але я запитую, чи є функція тільки для цього.

Наприклад, для повернення:

2009-12-01 00:00:00

2
Хороше питання. Прості, але ефективні для виявлення наведених нижче рішень timeTime, які кожен програміст бореться із запам'ятовуванням.
Sweet Chilly Philly

Відповіді:



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

Подивіться тут, щоб отримати докладнішу інформацію: http://pl.php.net/manual/en/function.date.php


3
Я хотів би підкреслити, як ви і @troelskn надіслали однакову відповідь 3 січня 2010 року о 17:08, але він все одно отримав ~ 800 грошей більше. Ваша відповідь, ймовірно, була секундами від його. :) Дякую, що все
Олександр

Через 9 секунд (видно, якщо ви наведіть напис "відповідь"
Grzegorz Oledzki

110

При PHP-версії> = 5.4 DateTime може це зробити: -

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

Дивіться, як це працює .


4
приємна ідея загортання конструктора та форматування його правильним шляхом.
акме

нарешті php почав копіювати з delphi та c # :)
Erçin Dedeoğlu

1
це може бути приємно, але зовсім не відповідає на запитання, зробити це не простіше і швидше
Asped

8
@Asped Яким чином це не відповідає на питання? Це функція PHP, яка "повертає дату та час у тому ж форматі, що і функція MySQL NOW ()", в чому полягає саме питання.
vascowhite

@vascowhite - питання полягало в тому, чи є для цього одна конкретна функція. тому відповідь НІ. всі інші перераховані тут можливості, можливо, спрацюють, і ваші теж приємні, але не допомагають, оскільки хлопець, який запитував, вже знав спосіб, як це зробити, але хотів простішу, одноцільову функцію, якої у вас немає :)
Asped

34

Використовуйте цю функцію:

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');
}

25

Спробуйте це:

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

181
Правильно, якщо ви витрачаєте таких персонажів, ми їх закінчимо.
Білл Карвін

4
так, мій поганий час ()
фактично

15
Насправді 8 символів.
Генрік Ерландссон

52
розглядаючи всі відходи тут, я вважаю досить ганебним, що він використав подвійні цитати
Аугі Гарднер,

37
Уявіть, що всі персонажі даремно коментують марнотратство персонажів!
Pwnball

25

Коротка відповідь

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

Прочитайте нижче для довгої відповіді.




Міміка функції MySQL NOW () у PHP

Ось список способів PHP, що імітують функцію MySQL NOW().

// 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);

Я думаю, що date_create()->format('Y-m-d H:i:s')це найкращий спосіб, тому що такий підхід дозволяє обробляти маніпуляції часом / часовим поясом простіше, ніж date('Y-m-d H:i:s')це працює з php 5.2.


MySQL NOW () функція

Функція MySQL NOW()дає значення DATETIME в наступному форматі: 'YYYY-MM-DD HH:MM:SS'. Дивіться тут: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

Цікавим фактом є те, що отримати формат дати можна, запустивши цей запит:, SHOW VARIABLES LIKE 'd%e_format'результат може бути приблизно таким:

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

Тут змінні - це змінні лише для читання. Тож ви не можете його змінити.

Я думаю, що NOW()функція MySQL отримує її формат із datetime_formatзмінної.




Переваги date_create () -> формату () замість зведення date ()

Сприятливі факти date_create('now')->format('Y-m-d H:i:s')закінченіdate('Y-m-d H:i:s') :

  • простіше впоратися з маніпуляціями часу
  • легше обробляти часові зони
  • ой

Недоліки date_create () -> формат () замість дати ()

Функція date()має дещо кращу продуктивність, ніж date_create()->format(). Дивіться тестовий тест нижче.

$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

У верхньому регістрі видно, що date()швидше. Однак якщо трохи змінити тестовий сценарій, результат буде іншим. Дивись нижче:

$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

Метод DateTime: format()тут швидше, ніж date().




Переваги date_create () -> формату () замість дати () детально

Читайте далі для детального пояснення.

простіше впоратися з маніпуляціями часу

date_create()приймає відносний формат дати / часу (наприклад now, yesterdayабо +1 day) див. це посилання , наприклад:

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

date() приймає також відносний формат дати / часу, як це:

$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

легше обробляти часові зони

Коли часові пояси матерії , то використання date_create()->format()робить набагато більше сенсу , то date()тому , що date()використовує часовий пояс за умовчанням , який налаштовується в php.iniв date.timezoneдирективі. Посилання: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

Можливо змінити часовий пояс під час виконання. Приклад:

date_default_timezone_set('Asia/Tokyo');.

Мінус цього полягає в тому, що це вплине на всі функції дати / часу. Ця проблема не існує, якщо ви використовуєте date_create()->format()в поєднанні з timezone_open().

PHP підтримує основні часові пояси. Найсмішніше, що він навіть підтримує арктичне коло та Антарктиду. Ви коли-небудь чули про це Longyearbyen? Якщо ні, то не хвилюйтеся, як і я, поки я не прочитав офіційну документацію PHP.

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

Перегляньте список усіх підтримуваних часових поясів: http://php.net/manual/en/timezones.php .

ой

OOP використовує об'єкти, заповнені державою. Тому я вважаю за краще думати таким чином:

// 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'); 

Тоді думати таким чином:

// 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'));

Тому я б сказав, що date_create()->format()тоді для мене підхід більш читабельний date().




date_create () VS новий DateTime ()

Сприятливі факти date_create()закінченняnew DateTime() :

  • Простори імен

Простори імен

Якщо ви працюєте в просторі імен і хочете ініціалізувати об’єкт DateTime новим ключовим словом, тоді вам потрібно зробити це так:

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();

У цьому немає нічого поганого, але недоліком вищесказаного є те, що люди епізодично забувають про нахил. За допомогою функції date_create()конструктора вам не доведеться турбуватися про простори імен.

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




Приклад формату date_create () -> ()

Я використовую такий підхід для своїх проектів, якщо мені доведеться заповнити масив. Подобається це:

$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'),
);

18

Я шукав ту саму відповідь, і я придумав це рішення для PHP 5.3 або пізнішої версії:

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

16

Функція MySQL NOW()повертає поточну мітку часу. Єдиний спосіб, який я знайшов для PHP - це використання наступного коду.

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

16

Ще одна відповідь, яку я вважаю простим у використанні:

echo date('c');

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

Це дата ISO 8601 (додана в PHP 5), яку використовує MySQL

Редагувати

MySQL 5.7 за замовчуванням не дозволяє часовий пояс у даті. Ви можете відключити помилку за допомогою SQL_MODE=ALLOW_INVALID_DATES. Дивіться відповідь тут для отримання більш детальної інформації: https://stackoverflow.com/a/35944059/2103434 . Але це також означає, що часовий пояс буде втрачено при збереженні в базі даних!

За замовчуванням MySQL використовує часовий пояс системи, і поки PHP використовує той самий часовий пояс, у вас повинно бути добре. У моєму випадку CET / UTC + 2.

Це означає, що якщо я вставляю 2015-07-27T00:00:00+02:00в базу даних, 2015-07-27T00:00:00зберігатимуться тільки (але це правильний місцевий час!).

Коли я завантажую час назад у PHP,

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

він автоматично припустить, що це +02:00часовий пояс, оскільки це за замовчуванням. Друк це буде знову правильним:

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

Щоб бути безпечним, завжди використовуйте UTC на сервері, вкажіть його в MySQL та PHP, а потім конвертуйте його лише у мову свого користувача під час відображення дати:

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


11

Або ви можете використовувати DateTimeконстанти :

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

Ось їх список:

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

Для налагодження я вважаю за краще коротший ( 3v4l.org ):

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

6

Мені подобається рішення, розміщене користувачем1786647, і я його трохи оновив, щоб змінити часовий пояс на аргумент функції та додати додаткову підтримку для передачі або рядка Unix часу або дати, який буде використаний для повернутої позначки дати.

Він також включає резервну копію для "setTimestamp" для користувачів, що мають версію нижче 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");
}

6

Ви можете використовувати функцію дати PHP з правильним форматом як параметр,

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

1

Немає вбудованої now()функції PHP , але це можна зробити за допомогою date().

Приклад

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

Ви можете використовувати, date_default_timezone_set()якщо вам потрібно змінити часовий пояс.

В іншому випадку ви можете використовувати Carbon - просте розширення API PHP для DateTime.


0

Якщо ви хочете отримати час зараз, включаючи AM / PM

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

Він виводить 2020-05-01 05:45:28 pm

або

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

Він виводить 2020-05-01 05:45:28 PM


-1

незабаром

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

php розширений зараз клас додатковий addMinute addYear як такий addHour тощо ...

<?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();

}




використовуючи

  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

Навіщо комусь потрібен цілий клас для чогось, що може бути повністю задоволений одним рядком коду?!? Якщо щось у цьому TLDR є цінним, це правильна відповідь на неправильне запитання.
mickmackusa

тому що зараз є об'єктом кожного разу
dılo sürücü

ОП запитувала лише конкретний відформатований рядок дати. Нічого більше. Без маніпуляцій з датою / часом. Це правильна відповідь на неправильне запитання.
mickmackusa

ı відредагований код повторіть погляд на код ...
dılo sürücü

Ваша редакція скопіювала запропоноване рішення з 3 з топ-5 відповідей на цій сторінці. Ви сприяєте розширенню сторінок (надлишковий вміст та по-за межами ради), і це не добре для Stackoverflow.
mickmackusa

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.