СЕЙЧАС () функция в PHP


479

Есть ли функция PHP, которая возвращает дату и время в том же формате, что и функция MySQL NOW()?

Я знаю, как сделать это с помощью date(), но я спрашиваю, есть ли функция только для этого.

Например, чтобы вернуть:

2009-12-01 00:00:00

2
Хороший вопрос. Простой, но эффективный способ раскрытия приведенных ниже решений dateTime, которые каждый программист пытается запомнить.
— 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 голосов больше. Ваш ответ был, вероятно, на расстоянии нескольких секунд от его. :) Спасибо, что написали в любом случае: D
— Александар

9 секунд спустя (отображается при наведении курсора на «ответ» с надписью)
— Гжегож Оледзки

110

С версией PHP> = 5.4 DateTime может сделать это: -

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

Посмотрите, как это работает .


4
хорошая идея обернуть конструктор и правильно отформатировать его.
— акме

наконец php начал копировать из delphi и c # :)
— Erçin Dedeodelu

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
да мой плохой время () на самом деле не нужно
— streetparade

15
8 символов, на самом деле.
— Хенрик Эрландссон

52
Принимая во внимание все отходы здесь, я нахожу довольно постыдным, что он использовал двойные кавычки
— Оги Гарднер

37
Представьте, что все персонажи напрасно комментируют пустую трата персонажей!
— Pwnball

25

Короткий ответ

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

Читайте ниже для длинного ответа.




Мимикрия функции MySQL NOW () в PHP

Вот список способов в PHP, которые имитируют NOW()функцию MySQL .

// 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 () -> format () вместо date ()

Благоприятные факты date_create('now')->format('Y-m-d H:i:s')над date('Y-m-d H:i:s')являются:

  • легче справляться с временными манипуляциями
  • легче обрабатывать часовые пояса
  • OOP

Недостатки date_create () -> format () вместо date ()

Функция 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 () -> format () вместо date () подробно

Продолжайте читать для подробного объяснения.

легче справляться с временными манипуляциями

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

Я использую этот подход для своих проектов, если мне нужно заполнить массив. Нравится:

$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 не разрешает часовой пояс в datetime по умолчанию. Вы можете отключить ошибку с помощью 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

Мне нравится решение, опубликованное user1786647, и я немного обновил его, чтобы изменить часовой пояс на аргумент функции и добавить дополнительную поддержку для передачи либо строки времени 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 - простое расширение PHP API для 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 advanced теперь класс extra 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.