Funkcja NOW () w PHP


479

Czy istnieje funkcja PHP, która zwraca datę i godzinę w tym samym formacie, co funkcja MySQL NOW()?

Wiem, jak to zrobić date(), ale pytam, czy jest tylko funkcja do tego.

Na przykład, aby zwrócić:

2009-12-01 00:00:00

2
Dobre pytanie. Prosty, ale skuteczny w przedstawianiu poniższych rozwiązań dateTime, z którymi każdy programista ma problemy z zapamiętywaniem.
Sweet Chilly Philly

Odpowiedzi:



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

Zajrzyj tutaj, aby uzyskać więcej informacji: http://pl.php.net/manual/en/function.date.php


3
Chciałbym podkreślić, że zarówno Ty, jak i @troelskn wysłali tę samą odpowiedź 3 stycznia 2010 r. O 17:08, ale nadal otrzymał około 800 głosów pozytywnych. Twoja odpowiedź była prawdopodobnie kilka sekund od jego. :) Dziękujemy za napisanie go: D
Aleksandar

9 sekund później (widoczne po najechaniu kursorem „odpowiedzi”)
Grzegorz Oledzki

110

W wersji PHP> = 5.4 DateTime może to zrobić: -

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

Zobacz, jak działa .


4
fajny pomysł na zawinięcie konstruktora i sformatowanie go we właściwy sposób.
acme

w końcu php zaczął kopiować z delphi ic # :)
Erçin Dedeoğlu

1
to może być miłe, ale w ogóle nie odpowiada na pytanie, nie jest to łatwiejsze ani szybsze
Asped

8
@Asped W jaki sposób nie odpowiada na pytanie? Jest to funkcja PHP, która „zwraca datę i godzinę w tym samym formacie, co funkcja MySQL NOW ()”, co jest właśnie pytaniem.
vascowhite

@vascowhite - pytanie brzmiało, czy istnieje konkretna funkcja dla tego jednego celu. więc odpowiedź brzmi NIE. wszystkie inne możliwości wymienione tutaj mogą działać i twoje też jest miłe, ale nie pomaga, ponieważ facet pytający już wiedział, jak to zrobić, ale chciał łatwiejszej, jednofunkcyjnej funkcji, której twoja nie jest :)
Asped

34

Użyj tej funkcji:

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

Spróbuj tego:

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

181
Racja, jeśli zmarnujesz takie postacie, zabraknie ich.
Bill Karwin

4
tak źle, czas () tak
naprawdę

15
Właściwie 8 znaków.
Henrik Erlandsson

52
Biorąc pod uwagę wszystkie marnotrawstwo tutaj, uważam, że to dość wstydliwe, że użył podwójnych cytatów
Augie Gardner,

37
Wyobraź sobie, że wszystkie postacie zmarnowane na komentowanie marnotrawstwa postaci!
Pwnball

25

Krótka odpowiedź

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

Długa odpowiedź znajduje się poniżej.




Naśladowanie funkcji MySQL NOW () w PHP

Oto lista sposobów naśladowania NOW()funkcji MySQL w PHP .

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

Myślę, że date_create()->format('Y-m-d H:i:s')to najlepszy sposób, ponieważ takie podejście pozwala łatwiej obsługiwać czas / strefę czasową date('Y-m-d H:i:s')i działa od php 5.2.


Funkcja MySQL NOW ()

Funkcja MySQL NOW()daje wartość datetime w formacie: 'YYYY-MM-DD HH:MM:SS'. Zobacz tutaj: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

Ciekawym faktem jest to, że można uzyskać format daty i godziny, uruchamiając to zapytanie: SHOW VARIABLES LIKE 'd%e_format'wynik może wyglądać mniej więcej tak:

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

Zmienne tutaj są zmiennymi tylko do odczytu. Więc nie możesz tego zmienić.

Myślę, że NOW()funkcja MySQL pobiera format ze datetime_formatzmiennej.




Zalety funkcji date_create () -> format () zamiast date () podsumowanie

Korzystne fakty date_create('now')->format('Y-m-d H:i:s')ponad date('Y-m-d H:i:s')to:

  • łatwiejsze do manipulowania czasem
  • łatwiejsza obsługa stref czasowych
  • ooo

Wady date_create () -> format () zamiast date ()

Funkcja date()ma nieco lepszą wydajność niż date_create()->format(). Zobacz test porównawczy poniżej.

$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

Wielkie litery pokazują, że date()jest szybszy. Jeśli jednak zmienimy nieco scenariusz testowy, wynik będzie inny. Patrz poniżej:

$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

Metoda DateTime: format()jest tutaj szybsza niż date().




Zalety date_create () -> format () zamiast date () szczegółowe

Czytaj dalej, aby uzyskać szczegółowe wyjaśnienie.

łatwiejsze do manipulowania czasem

date_create()akceptuje format względna data / czas (jak now, yesterdaylub +1 day) zobaczyć ten link , na przykład:

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

date() akceptuje również względny format daty / godziny, taki jak ten:

$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

łatwiejsza obsługa stref czasowych

Kiedy stref czasowych znaczenia następnie użycie date_create()->format()sprawia, że wiele większy sens wtedy date(), ponieważ date()używa domyślnej strefy czasowej, który jest skonfigurowany php.iniw date.timezonedyrektywie. Link: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

Możliwa jest zmiana strefy czasowej w czasie wykonywania. Przykład:

date_default_timezone_set('Asia/Tokyo');.

Wadą tego jest to, że wpłynie to na wszystkie funkcje daty / godziny. Ten problem nie istnieje, jeśli używasz go date_create()->format()w połączeniu z timezone_open().

PHP obsługuje główne strefy czasowe. Zabawne jest to, że obsługuje nawet koło podbiegunowe i Antarktydę. Czy kiedykolwiek słyszałeś o Longyearbyen? Jeśli nie, to nie martw się, ja też nie przeczytałem oficjalnej dokumentacji PHP.

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

Zobacz listę wszystkich obsługiwanych stref czasowych: http://php.net/manual/en/timezones.php .

ooo

OOP używa obiektów pełnych stanu. Wolę więc myśleć w ten sposób:

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

Następnie pomyśl w ten sposób:

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

Dlatego powiedziałbym, że to date_create()->format()podejście jest dla mnie bardziej czytelne date().




date_create () VS nowy DateTime ()

Korzystne fakty date_create()ponad new DateTime()to:

  • Przestrzenie nazw

Przestrzenie nazw

Jeśli pracujesz w przestrzeni nazw i chcesz zainicjować obiekt DateTime za pomocą nowego słowa kluczowego, musisz to zrobić w następujący sposób:

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

Nie ma w tym nic złego, ale wadą tego jest to, że ludzie czasami zapominają o odwrotnym ukośniku. Korzystając z date_create()funkcji konstruktora, nie musisz się martwić o przestrzenie nazw.

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




Przykład date_create () -> format ()

Używam tego podejścia do moich projektów, jeśli muszę wypełnić tablicę. Lubię to:

$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

Szukałem tej samej odpowiedzi i wymyśliłem to rozwiązanie dla PHP 5.3 lub nowszego:

$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

Funkcja MySQL NOW()zwraca bieżący znacznik czasu. Jedyny sposób, jaki znalazłem dla PHP, to użycie następującego kodu.

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

16

Jeszcze jedna odpowiedź, którą uważam za łatwą w użyciu:

echo date('c');

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

Jest to data ISO 8601 (dodana w PHP 5), której używa MySQL

Edytować

MySQL 5.7 domyślnie nie zezwala na strefę czasową w czasie danych. Możesz wyłączyć błąd za pomocą SQL_MODE=ALLOW_INVALID_DATES. Aby uzyskać więcej informacji, zobacz odpowiedź tutaj: https://stackoverflow.com/a/35944059/2103434 . Ale oznacza to również, że strefa czasowa zostanie utracona podczas zapisywania w bazie danych!

Domyślnie MySQL używa strefy czasowej systemu i tak długo, jak PHP używa tej samej strefy czasowej nie powinno być problemu. W moim przypadku CET / UTC + 2.

Oznacza to, że jeśli wstawię 2015-07-27T00:00:00+02:00do bazy danych, tylko 2015-07-27T00:00:00będą przechowywane (ale to jest właściwy czas lokalny!).

Kiedy ponownie załaduję czas do PHP,

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

automatycznie przyjmie +02:00strefę czasową, ponieważ jest domyślna. Drukowanie to będzie znowu poprawne:

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

Aby być bezpiecznym, zawsze używaj UTC na serwerze, określ go w MySQL i PHP, a następnie przekonwertuj na ustawienia regionalne użytkownika tylko podczas wyświetlania daty:

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

Lub możesz użyć DateTimestałych :

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

Oto ich lista:

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

Do debugowania wolę jednak krótszy ( 3v4l.org ):

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

6

Podoba mi się rozwiązanie opublikowane przez user1786647 i trochę go zaktualizowałem, aby zmienić strefę czasową na argument funkcji i dodać opcjonalną obsługę przekazywania uniksowego ciągu czasu lub ciągu daty i godziny do użycia dla zwróconego znacznika danych.

Zawiera również rezerwę dla „setTimestamp” dla użytkowników z wersją niższą niż 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

Możesz użyć funkcji daty PHP z poprawnym formatem jako parametrem,

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

1

Nie ma wbudowanej now()funkcji PHP , ale możesz to zrobić za pomocą date().

Przykład

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

Możesz użyć, date_default_timezone_set()jeśli chcesz zmienić strefę czasową.

W przeciwnym razie możesz skorzystać z Carbon - prostego rozszerzenia API PHP dla DateTime.


0

Jeśli chcesz mieć teraz czas, w tym AM / PM

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

Wyprowadza 2020-05-01 05:45:28 pm

lub

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

Wyprowadza 2020-05-01 05:45:28 PM


-1

wkrótce

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

php zaawansowane teraz klasa dodatkowy addMinute addYear jako taki addHour itp ...

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

}




za pomocą

  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

Dlaczego ktoś miałby potrzebować całej klasy dla czegoś, co można całkowicie zaspokoić w jednym wierszu kodu?!? Jeśli coś w tym TLDR jest wartościowe, jest to właściwa odpowiedź na złe pytanie.
mickmackusa

ponieważ teraz jest przedmiotem za każdym razem
dılo sürücü

OP poprosił tylko o określony sformatowany ciąg daty. Nic więcej. Brak manipulacji datą i godziną. To jest prawidłowa odpowiedź na złe pytanie.
mickmackusa

edytowałem kod powtórz spójrz na kod ...
dılo sürücü

Twoja edycja skopiowała sugerowane rozwiązanie z 3 z 5 najlepszych odpowiedzi na tej stronie. Przyczyniasz się do wzdęcia strony (zbędne treści i porady poza zakresem), co nie jest dobre dla Stackoverflow.
mickmackusa

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.