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.