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

442

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

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

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

2009-12-01 00:00:00
  • 2
    Хороший вопрос. Простой, но эффективный способ раскрытия приведенных ниже решений dateTime, которые каждый программист пытается запомнить.
Теги:
datetime
timestamp
time

14 ответов

882
Лучший ответ

Кроме того:

date("Y-m-d H:i:s");
  • 45
    Обратите внимание, что вам может понадобиться использовать функцию date_default_timezone_set
  • 0
    Спасибо за этот полезный совет.
Показать ещё 1 комментарий
122
date('Y-m-d H:i:s')

Смотрите здесь для получения дополнительной информации: http://pl.php.net/manual/en/function.date.php

99

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

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

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

  • 3
    хорошая идея обернуть конструктор и правильно отформатировать его.
  • 0
    наконец php начал копировать с delphi и c # :)
Показать ещё 13 комментариев
32

Используйте эту функцию:

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

Попробуй это:

date("Y-m-d H:i:s");
  • 9
    Вам действительно не нужен второй параметр .... трата 6 символов IMO.
  • 179
    Правильно, если вы будете тратить впустую таких персонажей, мы их исчерпаем.
Показать ещё 6 комментариев
19

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

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

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




Мимикрия в PHP

Чтобы имитировать функцию MySQL NOW() в PHP, вы можете использовать date_create()->format('Ymd H:i:s'). Этот подход позволяет вам легче обрабатывать временные/часовые пояса, чем date('Ymd H:i:s'). Это более читабельно и работает с php 5.2.

$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'); // works as well, but it less nice then date_create()

Причина, по которой это работает, заключается в том, что функция 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:%

Переменные здесь являются переменными только для чтения. Так что ты не можешь это изменить. Я предполагаю, что функция MySQL NOW() получает ее формат из переменной datetime_format.


date_create() → format() VS date()

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

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

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

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? Если нет, то не волнуйтесь, я не слышал об этом 5 минут назад. Но хорошо то, что PHP знает об Arctic/Longyearbyen.

См. Список всех поддерживаемых часовых поясов: http://php.net/manual/en/timezones.php.

больше упс

ООП использует объекты с полным состоянием. Поэтому я предпочитаю думать так:

// 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_create()->format() чем date().


Пример 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'),
);
15

Функция MySQL NOW() возвращает текущую временную метку. Единственный способ, который я нашел для PHP, - использовать следующий код.

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

Я искал тот же ответ, и я придумал это решение для 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");
14

Используйте strftime:

strftime("%F %T");
  • %F совпадает с %Y-%m-%d.

  • %T совпадает с %H:%M:%S.

Здесь демонстрация на идеоне.

13

Еще один ответ, который я считаю простым в использовании:

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/questions/14625191/error-code-1292-incorrect-date-value-mysql Но это также означает, что часовой пояс будет потерян при сохранении в базе данных!

По умолчанию 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
9

Или вы можете использовать константы 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
5

Вы можете использовать функцию даты php с правильным форматом в качестве параметра,

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

Мне нравится решение, отправленное пользователем1786647, я немного его обновил, чтобы изменить часовой пояс на аргумент функции и добавить дополнительную поддержку для передачи строки времени Unix или datetime для использования возвращаемой даты.

Также включает откат для "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");
}
-1

Вы можете использовать класс simplePHP для этого:

echo $date->now();

Этот класс также предоставляет множество полезных методов для сложения, вычитания и сравнения даты. Вы можете проверить страницу учебников для получения дополнительных примеров.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню