SEKARANG () berfungsi dalam PHP


479

Apakah ada fungsi PHP yang mengembalikan tanggal dan waktu dalam format yang sama dengan fungsi MySQL NOW()?

Saya tahu bagaimana melakukannya dengan menggunakan date(), tetapi saya bertanya apakah ada fungsi hanya untuk ini.

Misalnya, untuk mengembalikan:

2009-12-01 00:00:00

2
Pertanyaan bagus. Sederhana namun efektif dalam mengeluarkan solusi DateTime di bawah ini yang sulit diingat oleh setiap programmer.
Sweet Chilly Philly

Jawaban:



143
date('Y-m-d H:i:s')

Lihat di sini untuk rincian lebih lanjut: http://pl.php.net/manual/en/function.date.php


3
Saya ingin menekankan bagaimana Anda dan @troelskn mengirim jawaban yang sama pada tanggal 3 Januari 2010. jam 17:08, tetapi ia masih mendapat ~ 800 lebih banyak suara. Kiriman jawaban Anda mungkin terpisah beberapa detik darinya. :) Terima kasih telah menulisnya: D
Aleksandar

9 detik kemudian (terlihat jika Anda membawa label "jawab" berlabel)
Grzegorz Oledzki

110

Dengan versi PHP> = 5.4 DateTime dapat melakukan ini: -

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

Lihat berhasil .


4
ide bagus membungkus konstruktor dan memformatnya dengan benar.
acme

akhirnya php mulai menyalin dari delphi dan c # :)
Erçin Dedeoğlu

1
ini mungkin bagus, tetapi tidak menjawab pertanyaan sama sekali, tidak mudah atau lebih cepat untuk melakukannya dengan cara ini
Asped

8
@ Ditanyakan Dengan cara apa tidak menjawab pertanyaan? Ini adalah fungsi PHP yang "mengembalikan tanggal & waktu dalam format yang sama dengan fungsi MySQL SEKARANG ()", yang justru merupakan pertanyaan.
vascowhite

@vascowhite - pertanyaannya adalah apakah ada fungsi khusus untuk tujuan yang satu ini. jadi jawabannya adalah TIDAK. semua kemungkinan lain yang tercantum di sini mungkin berfungsi dan milik Anda juga bagus, tetapi tidak membantu, karena lelaki yang bertanya sudah tahu cara melakukannya, tetapi menginginkan fungsi yang lebih mudah dan bertujuan tunggal, yang bukan milik Anda :)
Asped

34

Gunakan fungsi ini:

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

Coba ini:

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

181
Benar, jika Anda membuang karakter seperti itu, kita akan kehabisan mereka.
Bill Karwin

4
ya buruk saya waktu () sebenarnya tidak diperlukan
streetparade

15
8 karakter, sebenarnya.
Henrik Erlandsson

52
mengingat semua pemborosan di sekitar sini, saya merasa sangat memalukan dia menggunakan tanda kutip ganda
Augie Gardner

37
Bayangkan semua karakter terbuang untuk mengomentari pemborosan karakter!
Pwnball

25

Jawaban singkat

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

Baca di bawah untuk jawaban yang panjang.




Mimikri dari fungsi MySQL NOW () di PHP

Berikut adalah daftar cara dalam PHP yang meniru NOW()fungsi 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);

Saya pikir itu date_create()->format('Y-m-d H:i:s')adalah cara terbaik karena pendekatan ini memungkinkan Anda untuk menangani manipulasi waktu / zona waktu lebih mudah daripada date('Y-m-d H:i:s')dan bekerja sejak php 5.2.


Fungsi MySQL NOW ()

Fungsi MySQL NOW()memberikan nilai datetime dalam format ini: 'YYYY-MM-DD HH:MM:SS'. Lihat di sini: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

Fakta yang menarik adalah bahwa dimungkinkan untuk mendapatkan format datetime dengan menjalankan kueri ini:, SHOW VARIABLES LIKE 'd%e_format'hasilnya bisa seperti ini:

Variable_name     Value     
date_format       %Y-%m-%d
datetime_format   %Y-%m-%d %H:%i:%s

Variabel di sini adalah variabel read-only. Jadi Anda tidak bisa mengubahnya.

Saya kira NOW()fungsi MySQL mendapatkan formatnya dari datetime_formatvariabel.




Kelebihan date_create () -> format () sebagai ganti date ()

Fakta yang menguntungkan dari date_create('now')->format('Y-m-d H:i:s')lebih date('Y-m-d H:i:s')adalah:

  • lebih mudah untuk menangani manipulasi waktu
  • lebih mudah untuk menangani zona waktu
  • oop

Kerugian date_create () -> format () sebagai gantinya date ()

Fungsi ini date()memiliki kinerja yang sedikit lebih baik daripada date_create()->format(). Lihat tes benchmark di bawah ini.

$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

Huruf besar menunjukkan bahwa date()lebih cepat. Namun, jika kita mengubah sedikit skenario pengujian, maka hasilnya akan berbeda. Lihat di bawah:

$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

Metode DateTime: format()lebih cepat di sini daripada date().




Kelebihan date_create () -> format () bukannya date () dirinci

Baca terus untuk penjelasan terperinci.

lebih mudah untuk menangani manipulasi waktu

date_create()menerima format tanggal / waktu relatif (seperti now, yesterdayatau +1 day) lihat tautan ini , contoh:

$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 

date() menerima format tanggal / waktu relatif juga, seperti ini:

$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

lebih mudah untuk menangani zona waktu

Ketika zona waktu penting maka penggunaan date_create()->format()lebih masuk akal kemudian date()karena date()menggunakan zona waktu default yang dikonfigurasi dalam php.inidi date.timezonedirektif. Tautan: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

Dimungkinkan untuk mengubah zona waktu selama waktu berjalan. Contoh:

date_default_timezone_set('Asia/Tokyo');.

Kelemahan dari itu adalah bahwa hal itu akan mempengaruhi semua fungsi tanggal / waktu. Masalah ini tidak ada jika Anda menggunakan date_create()->format()dalam kombinasi dengan timezone_open().

PHP mendukung zona waktu utama. Yang lucu adalah bahwa ia bahkan mendukung lingkaran Arktik, dan Antartika. Pernahkah Anda mendengar tentang Longyearbyen? Jika tidak, maka jangan khawatir, saya juga tidak sampai saya membaca dokumentasi PHP resmi.

$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');

Lihat daftar semua zona waktu yang didukung: http://php.net/manual/en/timezones.php .

oop

OOP menggunakan Object state-full. Jadi saya lebih suka berpikir seperti ini:

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

Kemudian berpikir seperti ini:

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

Karena itu saya akan mengatakan bahwa date_create()->format()pendekatannya lebih mudah dibaca oleh saya date().




date_create () VS DateTime baru ()

Fakta yang menguntungkan dari date_create()lebih new DateTime()adalah:

  • Ruang nama

Ruang nama

Jika Anda bekerja di namespace dan ingin menginisialisasi objek DateTime dengan kata kunci baru, maka Anda harus melakukannya seperti ini:

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

Tidak ada yang salah dengan ini, tetapi kelemahan di atas adalah bahwa orang lupa secara sporadis tentang backslash. Dengan menggunakan date_create()fungsi konstruktor Anda tidak perlu khawatir tentang ruang nama.

$dt = date_create(); // in or not in a namespace it works in both situations




Contoh date_create () -> format ()

Saya menggunakan pendekatan ini untuk proyek saya jika saya harus mengisi array. Seperti ini:

$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

Saya mencari jawaban yang sama, dan saya menemukan solusi ini untuk PHP 5.3 atau lebih baru:

$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

Fungsi MySQL NOW()mengembalikan stempel waktu saat ini. Satu-satunya cara saya menemukan PHP menggunakan kode berikut.

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

16

Satu lagi jawaban yang saya temukan mudah digunakan:

echo date('c');

// 2015-07-27T00:00:00+02:00

Ini adalah tanggal ISO 8601 (ditambahkan dalam PHP 5) yang digunakan MySQL

Edit

MySQL 5.7 tidak mengizinkan zona waktu di datetime secara default. Anda dapat menonaktifkan kesalahan dengan SQL_MODE=ALLOW_INVALID_DATES. Lihat jawabannya di sini untuk perincian lebih lanjut: https://stackoverflow.com/a/35944059/2103434 . Tetapi itu juga berarti bahwa zona waktu akan hilang ketika menyimpan ke database!

Secara default MySQL menggunakan zona waktu sistem, dan selama PHP menggunakan zona waktu yang sama Anda harus baik-baik saja. Dalam kasus saya CET / UTC + 2.

Itu berarti bahwa jika saya memasukkan 2015-07-27T00:00:00+02:00ke dalam basis data, hanya 2015-07-27T00:00:00akan disimpan (tetapi itu adalah waktu setempat yang benar!).

Ketika saya memuat waktu kembali ke PHP,

$importedDate = new \DateTime('2015-07-27T00:00:00')

secara otomatis akan menganggap itu +02:00zona waktu karena merupakan default. Pencetakan ini akan benar lagi:

echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00

Agar aman, selalu gunakan UTC di server, tentukan di MySQL dan PHP, dan kemudian hanya konversikan ke lokal pengguna Anda saat menampilkan tanggal:

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

Atau Anda dapat menggunakan DateTimekonstanta :

echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00

Berikut daftar mereka:

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

Untuk debugging, saya lebih suka yang lebih pendek ( 3v4l.org ):

echo date('ymd\THisP'); // 180614T120708+02:00

6

Saya suka solusi yang diposting oleh user1786647, dan saya telah memperbaruinya sedikit untuk mengubah zona waktu ke argumen fungsi dan menambahkan dukungan opsional untuk melewati waktu Unix atau string datetime untuk digunakan untuk datestamp yang dikembalikan.

Ini juga termasuk fallback untuk "setTimestamp" untuk pengguna yang menjalankan versi lebih rendah dari 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

Anda dapat menggunakan fungsi tanggal PHP dengan format yang benar sebagai parameter,

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

1

Tidak ada now()fungsi PHP bawaan, tetapi Anda bisa melakukannya menggunakan date().

Contoh

function now() {
    return date('Y-m-d H:i:s');
}

Anda dapat menggunakan date_default_timezone_set()jika Anda perlu mengubah zona waktu.

Kalau tidak, Anda dapat menggunakan Carbon - Ekstensi PHP API sederhana untuk DateTime.


0

Jika Anda ingin mendapatkan waktu sekarang termasuk AM / PM

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

Ini menghasilkan 2020-05-01 05:45:28 pm

atau

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

Ini menghasilkan 2020-05-01 05:45:28 PM


-1

segera

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

php maju sekarang kelas tambahan addMinute addYear seperti addHour dll ...

<?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();

}




menggunakan

  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

Mengapa ada orang yang membutuhkan seluruh kelas untuk sesuatu yang dapat sepenuhnya dipenuhi dalam satu baris kode?!? Jika ada sesuatu dalam TLDR ini yang bernilai, itu adalah jawaban yang benar untuk pertanyaan yang salah.
mickmackusa

karena sekarang adalah objek setiap
dılo sürücü

OP hanya meminta string tanggal yang diformat khusus. Tidak ada lagi. Tidak ada manipulasi tanggal / waktu. Ini adalah jawaban yang benar untuk pertanyaan yang salah.
mickmackusa

ı kode yang sudah diedit ulangi lihat kode ...
dılo sürücü

Hasil edit Anda telah menyalin solusi yang disarankan dari 3 dari 5 jawaban teratas di halaman ini. Anda berkontribusi pada penggembungan halaman (konten berlebihan dan saran di luar lingkup) dan ini tidak baik untuk Stackoverflow.
mickmackusa

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.