Có một hàm PHP trả về ngày và thời gian có cùng định dạng với hàm MySQL NOW()
không?
Tôi biết làm thế nào để sử dụng nó date()
, nhưng tôi hỏi nếu có một chức năng chỉ cho việc này.
Ví dụ: để trả về:
2009-12-01 00:00:00
Có một hàm PHP trả về ngày và thời gian có cùng định dạng với hàm MySQL NOW()
không?
Tôi biết làm thế nào để sử dụng nó date()
, nhưng tôi hỏi nếu có một chức năng chỉ cho việc này.
Ví dụ: để trả về:
2009-12-01 00:00:00
Câu trả lời:
Không ngoài chức năng ngày :
date("Y-m-d H:i:s");
date_default_timezone_set
chức năng
date('Y-m-d H:i:s')
Xem tại đây để biết thêm chi tiết: http://pl.php.net/manual/en/feft.date.php
Với phiên bản PHP> = 5.4 DateTime có thể làm điều này: -
echo (new \DateTime())->format('Y-m-d H:i:s');
Sử dụng chức năng này:
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');
}
Thử cái này:
date("Y-m-d H:i:s");
Câu trả lời ngắn
$now = date_create()->format('Y-m-d H:i:s');
Đọc dưới đây để trả lời dài.
Mô phỏng của hàm MySQL NOW () trong PHP
Dưới đây là danh sách các cách trong PHP bắt chước NOW()
hàm 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);
Tôi nghĩ đó date_create()->format('Y-m-d H:i:s')
là cách tốt nhất vì cách tiếp cận này cho phép bạn xử lý các thao tác thời gian / múi giờ dễ dàng hơn date('Y-m-d H:i:s')
và nó hoạt động kể từ php 5.2.
Hàm MySQL NOW()
cung cấp giá trị dateTime theo định dạng này : 'YYYY-MM-DD HH:MM:SS'
. Xem tại đây: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-fifts.html#feft_now .
Một sự thật thú vị là có thể lấy định dạng datetime bằng cách chạy truy vấn này : SHOW VARIABLES LIKE 'd%e_format'
, kết quả có thể là như thế này:
Variable_name Value
date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s
Các biến ở đây là các biến chỉ đọc. Vì vậy, bạn không thể thay đổi nó.
Tôi đoán NOW()
chức năng MySQL có định dạng từ datetime_format
biến.
Ưu điểm của tóm tắt date_create () -> format () thay vì date ()
Các sự thật thuận lợi của date_create('now')->format('Y-m-d H:i:s')
hơn date('Y-m-d H:i:s')
là:
Những nhược điểm của date_create () -> format () thay vì date ()
Các chức năng date()
có một hiệu suất tốt hơn một chút so với date_create()->format()
. Xem bài kiểm tra điểm chuẩn dưới đây.
$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
Các trường hợp trên cho thấy date()
là nhanh hơn. Tuy nhiên, nếu chúng ta thay đổi kịch bản thử nghiệm một chút, thì kết quả sẽ khác. Xem bên dưới:
$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
Phương thức DateTime: format()
ở đây nhanh hơn date()
.
Ưu điểm của date_create () -> format () thay vì date () chi tiết
Đọc để được giải thích chi tiết.
dễ dàng hơn để xử lý các thao tác thời gian
date_create()
chấp nhận định dạng ngày / giờ tương đối (như now
, yesterday
hoặc +1 day
) xem liên kết này , ví dụ:
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s');
date()
cũng chấp nhận một định dạng ngày / giờ tương đối, như thế này:
$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
dễ dàng hơn để xử lý múi giờ
Khi các múi giờ quan trọng thì việc sử dụng date_create()->format()
sẽ có ý nghĩa hơn rất nhiều date()
bởi vì date()
sử dụng múi giờ mặc định được cấu hình trong php.ini
lệnh date.timezone
. Liên kết: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .
Có thể thay đổi múi giờ trong thời gian chạy. Thí dụ:
date_default_timezone_set('Asia/Tokyo');
.
Nhược điểm của nó là nó sẽ ảnh hưởng đến tất cả các chức năng ngày / giờ. Vấn đề này không tồn tại nếu bạn đang sử dụng date_create()->format()
kết hợp với timezone_open()
.
PHP hỗ trợ các múi giờ chính. Điều buồn cười là nó thậm chí còn hỗ trợ vòng Bắc Cực và Nam Cực. Bạn đã bao giờ nghe nói về Longyearbyen
? Nếu không, thì đừng lo lắng, tôi cũng vậy, cho đến khi tôi đọc tài liệu PHP chính thức.
$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');
Xem danh sách tất cả các múi giờ được hỗ trợ: http://php.net/manual/en/timezones.php .
ôi
OOP sử dụng các Đối tượng đầy đủ trạng thái. Vì vậy, tôi thích nghĩ theo cách này:
// 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');
Sau đó suy nghĩ theo cách này:
// 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'));
Vì vậy, tôi sẽ nói rằng date_create()->format()
cách tiếp cận dễ đọc hơn đối với tôi sau đó date()
.
date_create () VS DateTime mới ()
Các sự thật thuận lợi của date_create()
hơn new DateTime()
là:
Không gian tên
Nếu bạn làm việc trong một không gian tên và muốn khởi tạo một đối tượng DateTime với từ khóa mới, thì bạn phải làm như thế này:
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();
Không có gì sai với điều này, nhưng nhược điểm của những điều trên là mọi người quên đi một cách rời rạc về dấu gạch chéo ngược. Bằng việc sử dụng date_create()
chức năng constructor bạn không phải lo lắng về không gian tên.
$dt = date_create(); // in or not in a namespace it works in both situations
Ví dụ về date_create () -> format ()
Tôi sử dụng phương pháp này cho các dự án của mình nếu tôi phải điền vào một mảng. Như thế này:
$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'),
);
Hàm MySQL NOW()
trả về dấu thời gian hiện tại. Cách duy nhất tôi tìm thấy cho PHP là sử dụng đoạn mã sau.
$curr_timestamp = date('Y-m-d H:i:s');
Một câu trả lời nữa tôi thấy dễ sử dụng:
echo date('c');
// 2015-07-27T00:00:00+02:00
Đây là ngày ISO 8601 (được thêm vào PHP 5) mà MySQL sử dụng
Theo mặc định, MySQL 5.7 không cho phép múi giờ theo thời gian. Bạn có thể vô hiệu hóa lỗi với SQL_MODE=ALLOW_INVALID_DATES
. Xem câu trả lời tại đây để biết thêm chi tiết: https://stackoverflow.com/a/35944059/2103434 . Nhưng điều đó cũng có nghĩa là múi giờ sẽ bị mất khi lưu vào cơ sở dữ liệu!
Theo mặc định, MySQL sử dụng múi giờ của hệ thống và miễn là PHP sử dụng cùng múi giờ đó, bạn sẽ ổn. Trong trường hợp của tôi CET / UTC + 2.
Điều đó có nghĩa là nếu tôi chèn 2015-07-27T00:00:00+02:00
vào cơ sở dữ liệu, chỉ 2015-07-27T00:00:00
sẽ được lưu trữ (nhưng đó là giờ địa phương chính xác!).
Khi tôi tải thời gian trở lại vào PHP,
$importedDate = new \DateTime('2015-07-27T00:00:00')
nó sẽ tự động coi đó là +02:00
múi giờ vì nó là mặc định. In này sẽ chính xác một lần nữa:
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
Sử dụng strftime
:
strftime("%F %T");
%F
cũng giống như %Y-%m-%d
.
%T
cũng giống như %H:%M:%S
.
Đây là một bản demo trên ideone.
Hoặc bạn có thể sử dụng DateTime
hằng số :
echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00
Đây là danh sách của họ:
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
Để gỡ lỗi, tôi thích cái ngắn hơn ( 3v4l.org ):
echo date('ymd\THisP'); // 180614T120708+02:00
Tôi thích giải pháp được đăng bởi user1786647 và tôi đã cập nhật một chút để thay đổi múi giờ thành đối số hàm và thêm hỗ trợ tùy chọn để chuyển chuỗi thời gian Unix hoặc datetime để sử dụng cho dấu thời gian được trả về.
Nó cũng bao gồm một dự phòng cho "setTimestamp" cho người dùng đang chạy phiên bản thấp hơn 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");
}
Bạn có thể sử dụng hàm ngày PHP với định dạng chính xác làm tham số,
echo date("Y-m-d H:i:s");
Không có now()
chức năng PHP tích hợp, nhưng bạn có thể thực hiện bằng cách sử dụng date()
.
Thí dụ
function now() {
return date('Y-m-d H:i:s');
}
Bạn có thể sử dụng date_default_timezone_set()
nếu bạn cần thay đổi múi giờ.
Nếu không, bạn có thể sử dụng Carbon - Một tiện ích mở rộng API PHP đơn giản cho DateTime.
trong thời gian ngắn
echo date('Y-m-d H:i:s');
php nâng cao bây giờ lớp thêm addMinute addYear như addHour của bạn, v.v ...
<?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();
}
sử dụng
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
Tương đương PHP là time()
: http://php.net/manual/en/feft.time.php
time() Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).