СЕЙЧАС () функция в 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.