PHP'de NOW () işlevi


479

Tarih ve saati MySQL işleviyle aynı biçimde döndüren bir PHP işlevi var mı NOW()?

Bunu kullanarak nasıl yapacağımı biliyorum date(), ama sadece bunun için bir fonksiyon olup olmadığını soruyorum.

Örneğin, geri dönmek için:

2009-12-01 00:00:00

2
İyi soru. Her programcının hatırlamakla mücadele ettiği aşağıdaki çözümleri ortaya çıkarmak için basit ama etkilidir.
Tatlı Soğuk Philly

Yanıtlar:



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

Daha fazla ayrıntı için buraya bakın: http://pl.php.net/manual/en/function.date.php


3
Hem siz hem de @troelskn'un aynı cevabı 3 Ocak 2010'da saat 17: 08'de nasıl gönderdiğini vurgulamak isterim, ancak yine de ~ 800 upvotes daha var. Cevabınız muhtemelen ondan birkaç saniye uzaktaydı. :)
Aleksandar

9 saniye sonra (etiketli "yanıtlanan" ı üzerine getirirseniz görünür)
Grzegorz Oledzki

110

PHP sürüm> = 5.4 ile DateTime bunu yapabilir: -

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

Çalıştığını görün .


4
güzel bir fikir yapıcı sarma ve doğru şekilde biçimlendirme.
acme

sonunda php delphi ve c # kopyalamaya başladı :)
Erçin Dedeoğlu

1
bu güzel olabilir, ancak soruya hiç cevap vermez, bu şekilde yapmak daha kolay veya daha hızlı değildir
Asped

8
@Asped Bu soruya ne şekilde cevap vermiyor? Tam olarak soru olan "MySQL işlevi NOW () ile aynı formatta tarih ve saati döndüren" bir PHP işlevidir.
vascowhite

@vascowhite - soru, bu amaç için belirli bir işlev olup olmadığıydı. Dolayısıyla cevap hayır. burada listelenen diğer tüm olasılıklar çalışıyor olabilir ve senin de güzel, ama yardımcı değil, çünkü bunu zaten nasıl yapacağını bildiği için, ama senin değil, daha kolay, tek amaçlı bir işlev istedi :)
Asped

34

Bu işlevi kullanın:

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

Bunu dene:

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

181
Doğru, böyle karakterleri boşa harcarsanız, onlardan kaçacağız.
Bill Karwin

4
Evet benim kötü zaman () aslında gerekli değil
streetparade

15
Aslında 8 karakter.
Henrik Erlandsson

52
Buradaki tüm atıkları göz önünde bulundurarak, o çift tırnak kullanılan oldukça utanç verici buluyorum
Augie Gardner

37
Tüm karakterlerin, israfı yorumlamak için harcadığını düşünün!
Pwnball

25

Kısa cevap

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

Uzun cevap için aşağıyı okuyun.




PHP'de MySQL NOW () işlevinin taklidi

PHP'de MySQL NOW()işlevini taklit eden yolların bir listesi .

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

Bunun date_create()->format('Y-m-d H:i:s')en iyi yol olduğunu düşünüyorum çünkü bu yaklaşım zaman / zaman dilimi manipülasyonlarını daha kolay idare etmenizi sağlıyor date('Y-m-d H:i:s')ve php 5.2'den beri çalışıyor.


MySQL NOW () işlevi

MySQL işlevi NOW()bu biçimde dateTime değerini verir: 'YYYY-MM-DD HH:MM:SS'. Buraya bakın: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

İlginç bir gerçek, bu sorguyu çalıştırarak datetime biçimini elde etmenin mümkün olmasıdır: SHOW VARIABLES LIKE 'd%e_format'sonuç şu şekilde olabilir:

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

Buradaki değişkenler salt okunur değişkenlerdir. Yani değiştiremezsiniz.

MySQL NOW()işlevinin biçimini datetime_formatdeğişkenden aldığını tahmin ediyorum .




Date () özeti yerine date_create () -> format () 'nın avantajları

Elverişli gerçekler date_create('now')->format('Y-m-d H:i:s')üzerinde date('Y-m-d H:i:s')şunlardır:

  • zaman manipülasyonlarını yönetmek daha kolay
  • zaman dilimlerini yönetmek daha kolay
  • öldürmezler

Date_create () -> format () yerine date () dezavantajları

Fonksiyon date()biraz daha iyi bir performansa sahiptir date_create()->format(). Aşağıdaki karşılaştırma testine bakın.

$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

Büyük harf bunun date()daha hızlı olduğunu gösterir . Ancak, test senaryosunu biraz değiştirirsek, sonuç farklı olacaktır. Aşağıya bakınız:

$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 yöntemi: format()burada daha hızlıdır date().




Date (create () -> format () 'ın yerine date () ayrıntılı

Ayrıntılı açıklama için okumaya devam edin.

zaman manipülasyonlarını yönetmek daha kolay

date_create()göreceli bir tarih / saat biçimini kabul (gibi now, yesterdayya +1 daybakınız) bu bağlantıyı , örnek:

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

date() aşağıdaki gibi göreli bir tarih / saat biçimini de kabul eder:

$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

zaman dilimlerini yönetmek daha kolay

Zaman dilimleri önemli olduğunda , yönerge içinde yapılandırılmış olan varsayılan saat dilimini kullandığından , kullanımı date_create()->format()çok daha mantıklıdır . Bağlantı: http://php.net/manual/tr/datetime.configuration.php#ini.date.timezone .date()date()php.inidate.timezone

Çalışma zamanı sırasında saat dilimini değiştirmek mümkündür. Misal:

date_default_timezone_set('Asia/Tokyo');.

Bunun dezavantajı, tüm tarih / saat işlevlerini etkileyecek olmasıdır. date_create()->format()İle birlikte kullanıyorsanız , bu sorun yok timezone_open().

PHP büyük zaman dilimlerini destekler. Komik olan şey, Arktik çemberini ve Antarktika'yı bile desteklemesi. Hiç duydun Longyearbyenmu? Değilse, endişelenmeyin, resmi PHP belgelerini okuyana kadar ben de yapmadım.

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

Desteklenen tüm zaman dilimlerinin listesine bakın: http://php.net/manual/en/timezones.php .

öldürmezler

OOP, durum dolu Nesneler kullanır. Bu şekilde düşünmeyi tercih ediyorum:

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

Sonra şu şekilde düşünün:

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

Bu nedenle date_create()->format()yaklaşımın benim için daha okunaklı olduğunu söyleyebilirim date().




date_create () VS yeni DateTime ()

Elverişli gerçekler date_create()üzerinde new DateTime()şunlardır:

  • Ad alanları

Ad alanları

Bir ad alanında çalışıyorsanız ve yeni bir anahtar sözcükle bir DateTime nesnesi başlatmak istiyorsanız, bunu şu şekilde yapmanız gerekir:

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

Bununla ilgili yanlış bir şey yok, ancak yukarıdakilerin dezavantajı, insanların ters eğik çizgi hakkında sporadik olarak unutmalarıdır. date_create()Yapıcı işlevini kullanarak ad alanları hakkında endişelenmenize gerek yoktur.

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




Date_create () -> format () örneği

Bir diziyi doldurmam gerekirse projelerim için bu yaklaşımı kullanıyorum. Bunun gibi:

$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

Aynı cevabı arıyordum ve PHP 5.3 veya üstü için bu çözümü buldum :

$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

MySQL işlevi NOW()geçerli zaman damgasını döndürür. PHP için bulduğum tek yol aşağıdaki kodu kullanmaktır.

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

16

Bir cevap daha kullanımı kolay buluyorum:

echo date('c');

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

Bu, MySQL'in kullandığı ISO 8601 tarihidir (PHP 5'e eklenmiştir)

Düzenle

MySQL 5.7 varsayılan olarak tarih saatinde saat dilimine izin vermez. Hatayı ile devre dışı bırakabilirsiniz SQL_MODE=ALLOW_INVALID_DATES. Daha fazla ayrıntı için cevaba bakınız: https://stackoverflow.com/a/35944059/2103434 . Ancak bu, veritabanına kaydederken saat diliminin kaybedileceği anlamına da gelir!

Varsayılan olarak MySQL, sistemin saat dilimini kullanır ve PHP aynı saat dilimini kullandığı sürece iyi olmanız gerekir. Benim durumumda CET / UTC + 2.

Bu 2015-07-27T00:00:00+02:00, veritabanına eklersem, yalnızca 2015-07-27T00:00:00depolanacağı anlamına gelir (ancak bu doğru yerel saattir!).

Zamanı PHP'ye geri yüklediğimde,

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

varsayılan olduğundan otomatik olarak +02:00saat dilimini varsayar . Bunu yazdırmak tekrar doğru olacaktır:

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

Güvende olmak için sunucuda her zaman UTC kullanın, MySQL ve PHP'de belirtin ve ardından yalnızca tarihi görüntülerken kullanıcının yerel ayarlarına dönüştürün:

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

Veya DateTimesabitleri kullanabilirsiniz :

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

İşte bunların listesi:

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

Hata ayıklama için daha kısa olanı tercih ederim ( 3v4l.org ):

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

6

Ben user1786647 tarafından gönderilen çözümü seviyorum ve ben bir işlev argümanına saat dilimini değiştirmek ve döndürülen tarih damgası için kullanmak için bir Unix zaman veya datetime dize geçirmek için isteğe bağlı destek eklemek için biraz güncelledim.

Ayrıca PHP 5.3'ten daha düşük bir sürüm çalıştıran kullanıcılar için "setTimestamp" için bir geri dönüş içerir:

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

PHP tarih işlevini parametre olarak doğru biçimde kullanabilirsiniz,

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

1

Yerleşik PHP now()işlevi yoktur, ancak bunu kullanarak yapabilirsiniz date().

Misal

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

date_default_timezone_set()Saat dilimini değiştirmeniz gerekirse kullanabilirsiniz .

Aksi takdirde, Carbon - DateTime için basit bir PHP API uzantısı kullanabilirsiniz.


0

AM / PM de dahil olmak üzere şimdi zaman almak istiyorsanız

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

Çıktı 2020-05-01 05:45:28 pm

veya

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

Çıktı 2020-05-01 05:45:28 PM


-1

kısaca

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

php gelişmiş şimdi sınıf ekstra addMinute addYear gibi addHour vb ...

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

}




kullanma

  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

Neden herkes bir kod satırında tamamen tatmin olabilecek bir şey için tüm bir sınıfa ihtiyaç duyar? Bu TLDR'deki herhangi bir değerin değeri varsa, yanlış sorunun doğru cevabıdır.
mickmackusa

çünkü şimdi nesne her zaman
dılo sürücü

OP yalnızca belirli bir biçimlendirilmiş tarih dizesi istedi. Başka bir şey yok. Tarih / saat manipülasyonu yok. Bu yanlış soruya doğru cevap.
mickmackusa

kodu tekrar düzenledim kodu bak ...
dılo sürücü

Düzenlemeniz, bu sayfadaki ilk 5 yanıtın 3'ünden önerilen çözümü kopyaladı. Sayfa şişkinliğine katkıda bulunuyorsunuz (gereksiz içerik ve kapsam dışı öneriler) ve bu Stackoverflow için iyi değil.
mickmackusa

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.