Чи є функція PHP, яка повертає дату та час у тому ж форматі, що і функція MySQL NOW()
?
Я знаю, як це зробити за допомогою date()
, але я запитую, чи є функція тільки для цього.
Наприклад, для повернення:
2009-12-01 00:00:00
Чи є функція PHP, яка повертає дату та час у тому ж форматі, що і функція MySQL NOW()
?
Я знаю, як це зробити за допомогою date()
, але я запитую, чи є функція тільки для цього.
Наприклад, для повернення:
2009-12-01 00:00:00
Відповіді:
Окрім функції дати :
date("Y-m-d H:i:s");
date_default_timezone_set
функцію
date('Y-m-d H:i:s')
Подивіться тут, щоб отримати докладнішу інформацію: http://pl.php.net/manual/en/function.date.php
При PHP-версії> = 5.4 DateTime може це зробити: -
echo (new \DateTime())->format('Y-m-d H:i:s');
Використовуйте цю функцію:
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');
}
Спробуйте це:
date("Y-m-d H:i:s");
Коротка відповідь
$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()
дає значення 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'),
);
Функція MySQL NOW()
повертає поточну мітку часу. Єдиний спосіб, який я знайшов для PHP - це використання наступного коду.
$curr_timestamp = date('Y-m-d H:i:s');
Ще одна відповідь, яку я вважаю простим у використанні:
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
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
Використання strftime
:
strftime("%F %T");
%F
те саме, що %Y-%m-%d
.
%T
те саме, що %H:%M:%S
.
Ось демонстрація на ideone.
Або ви можете використовувати 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
Мені подобається рішення, розміщене користувачем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");
}
Немає вбудованої now()
функції PHP , але це можна зробити за допомогою date()
.
Приклад
function now() {
return date('Y-m-d H:i:s');
}
Ви можете використовувати, date_default_timezone_set()
якщо вам потрібно змінити часовий пояс.
В іншому випадку ви можете використовувати Carbon - просте розширення API PHP для DateTime.
незабаром
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
Еквівалент PHP time()
: http://php.net/manual/en/function.time.php
time() Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).