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
MoeAmine
źródło
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:

1034

Nie tylko funkcja daty :

date("Y-m-d H:i:s");
troelskn
źródło
54
Pamiętaj, że może być konieczne użycie date_default_timezone_setfunkcji
Michel Ayres
czy w mysqli jest teraz nazwa funkcji?
MindRoasterMir
143
date('Y-m-d H:i:s')

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

hsz
źródło
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 .

vascowhite
źródło
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');
}
użytkownik1786647
źródło
25

Spróbuj tego:

date("Y-m-d H:i:s");
Parada uliczna
źródło
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'),
);
juliański
źródło
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");
Santi
źródło
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');
Shriganesh Shintre
źródło
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
Richard87
źródło
15

Użyj strftime:

strftime("%F %T");
  • %Fjest taki sam jak %Y-%m-%d.

  • %Tjest taki sam jak %H:%M:%S.

Oto demo na ideone.

Danny Beckett
źródło
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
CPHPython
źródło
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");
}
Seth
źródło
6

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

echo date("Y-m-d H:i:s");
Som
źródło
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.

RAZIUL
źródło
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

Joseph
źródło
-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ü <[email protected]>
 */
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
dılo sürücü
źródło
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