Hàm NOW () trong PHP


479

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

2
Câu hỏi hay. Đơn giản nhưng hiệu quả trong việc đưa ra các giải pháp dateTime dưới đây mà mọi lập trình viên phải vật lộn với việc ghi nhớ.
Sweet Chilly Philly

Câu trả lời:



143
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


3
Tôi muốn nhấn mạnh cách cả Bạn và @troelskn gửi cùng một câu trả lời vào ngày 3 tháng 1 năm 2010 lúc 17:08, nhưng anh ấy vẫn nhận được hơn 800 lượt. Gửi câu trả lời của bạn có lẽ là cách anh ấy vài giây. :) Cảm ơn bạn đã viết nó bằng mọi cách: D
Aleksandar

9 giây sau (hiển thị nếu bạn di chuột có nhãn "đã trả lời")
Grzegorz Oledzki

110

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

Xem nó hoạt động .


4
ý tưởng tốt đẹp bao bọc các nhà xây dựng và định dạng nó đúng cách.
acme

cuối cùng php bắt đầu sao chép từ delphi và c # :)
Erçin Dedeoğlu

1
Điều này có thể tốt, nhưng không trả lời câu hỏi nào cả, không dễ hơn cũng không nhanh hơn để làm theo cách này
Đã bắt đầu

8
@Asped Theo cách nào nó không trả lời câu hỏi? Đây là một hàm PHP "trả về ngày & giờ theo cùng định dạng với hàm MySQL NOW ()", đây chính xác là câu hỏi.
vascowhite

@vascowhite - câu hỏi là nếu có một chức năng cụ thể cho mục đích này. Vì vậy, câu trả lời là không. tất cả các khả năng khác được liệt kê ở đây có thể đang hoạt động và khả năng của bạn cũng rất tốt, nhưng không có ích gì, vì anh chàng hỏi đã biết cách thực hiện nó, nhưng muốn một chức năng đơn mục đích dễ dàng hơn, mà bạn thì không :)
Vào

34

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

25

Thử cái này:

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

181
Phải, nếu bạn lãng phí những nhân vật như thế, chúng ta sẽ hết chúng.
Bill Karwin

4
vâng, thời gian tồi tệ của tôi () là không cần thiết
streetparade

15
8 ký tự, thực sự.
Henrik Erlandsson

52
xem xét tất cả các chất thải xung quanh đây, tôi thấy khá xấu hổ khi anh ấy sử dụng dấu ngoặc kép
Augie Gardner

37
Hãy tưởng tượng tất cả các nhân vật lãng phí khi bình luận về sự lãng phí của các nhân vật!
Pwnball

25

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.


MySQL NOW () chức năng

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_formatbiế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à:

  • dễ dàng hơn để xử lý các thao tác thời gian
  • dễ dàng hơn để xử lý múi giờ
  • ôi

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, yesterdayhoặ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.inilệ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

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'),
);

18

Tôi đã tìm kiếm cùng một câu trả lời và tôi đã đưa ra giải pháp này cho PHP 5.3 trở lên:

$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

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

16

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

Biên tập

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:00vào cơ sở dữ liệu, chỉ 2015-07-27T00:00:00sẽ đượ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:00mú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

Để an toàn, luôn sử dụng UTC trên máy chủ, chỉ định nó trong MySQL và PHP và sau đó chỉ chuyển đổi nó thành ngôn ngữ người dùng của bạn khi hiển thị ngày:

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

Hoặc bạn có thể sử dụng DateTimehằ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

6

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");
}

6

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");

1

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.


0

Nếu bạn muốn có thời gian ngay bây giờ bao gồm AM / PM

<?php 
    $time_now = date("Y-m-d h:i:s a");
    echo $time_now;
?>

Nó xuất ra 2020-05-01 05:45:28 pm

hoặc là

<?php 
    $time_now = date("Y-m-d h:i:s A");
    echo $time_now;
?>

Nó xuất ra 2020-05-01 05:45:28 PM


-1

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ại sao bất cứ ai cũng cần cả một lớp cho một cái gì đó có thể hoàn toàn hài lòng trong một dòng mã?!? Nếu bất cứ điều gì trong TLDR này có giá trị, đó là câu trả lời đúng cho câu hỏi sai.
mickmackusa

bởi vì bây giờ là đối tượng mọi lúc
dılo sürücü

OP chỉ yêu cầu một chuỗi ngày được định dạng cụ thể. Chỉ có bấy nhiêu thôi. Không có thao tác ngày / giờ. Đây là câu trả lời đúng cho câu hỏi sai.
mickmackusa

Tôi đã chỉnh sửa mã lặp lại nhìn vào mã ...
dılo sürücü

Chỉnh sửa của bạn đã sao chép giải pháp được đề xuất từ ​​3 trong số 5 câu trả lời hàng đầu trên trang này. Bạn đang đóng góp cho sự phình to của trang (nội dung dư thừa và lời khuyên ngoài phạm vi) và điều này không tốt cho Stackoverflow.
mickmackusa

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.