pobierz czas UTC w PHP

122

Jak uzyskać znacznik czasu UTC / GMT +/- za pomocą funkcji date () w PHP? Na przykład, jeśli spróbuję

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

Otrzymam znacznik czasu Unix; ale muszę uzyskać znacznik czasu UTC / GMT z ciągiem GMT / UTC +/- 0400 lub GMT / UTC +/- 1000 w oparciu o lokalne czasy.

Robin Michael Poothurai
źródło
1
@JeffPuckettII GMT nie zmienia się na czas letni. W Wielkiej Brytanii latem zmienia się z GMT na BST, ale GMT pozostaje taki sam i zawsze odpowiada UTC.
lewis

Odpowiedzi:

111

Użycie gmdatezawsze zwróci datę GMT. Składnia jest taka sama jak dla date.

nikc.org
źródło
12
@sanmai: uniksowy znacznik czasu jest z definicji zawsze UTC. en.wikipedia.org/wiki/Unix_time
nikc.org
1
@ nikc.org: Problem polega na tym, że gmdate ("U") zwraca to samo co time (), który nie jest datownikiem UTC, jeśli strefa czasowa twojego serwera jest inna. Jedynym sposobem uzyskania prawdziwego znacznika czasu opartego na UTC był strtotime (gmdate ("M d YH: i: s")), który różni się od gmdate ("U"), gdy strefa czasowa systemu serwera jest inna niż UTC
bksi
@bksi Nie mogę powtórzyć opisanego przez Ciebie zachowania. (Mój komputer nie jest na GMT, a moje znaczniki czasu w systemie UNIX są poprawne gmdate("U") == time().) Brzmi jak potencjalnie błędne zachowanie. Dokładnie sprawdź i zgłoś błąd w projekcie PHP.
nikc.org
Użyłem prostego skryptu php, aby przetestować scenariusz: <? echo time (). "===" .strtotime (gmdate ("M d YH: i: s")). "Strefa czasowa:" .date ("Z"). "\ n"; ?> Kiedy go uruchomiłem, otrzymałem ten wynik: 1456342082 === 1456338482 Strefa czasowa: 3600 Wynik polecenia powłoki to: środa 24 lutego 20:28:11 CET 2016
bksi
1
@bksi - Być może mylisz wewnętrzną reprezentację daty i godziny z zewnętrzną reprezentacją daty i godziny? czas bez specyfikatora strefy a czas ze specyfikatorem strefy? Jak mówi nikc (i dokumentacja), time()zwraca „liczbę sekund od epoki Uniksa (1 stycznia 1970 00:00:00 GMT)”. Uwaga GMT. Fakt, że domyślnie twój system konwertuje to na twoją strefę czasową do wyświetlania, jest wygodą dla użytkownika. Wewnętrznie zawsze jest to GMT.
ToolmakerSteve
90

Prosty gmdate () wystarczy

<?php
print gmdate("Y-m-d\TH:i:s\Z");
Shankar Damodaran
źródło
47

Jak już wcześniej odpowiedzieliśmy , od PHP 5.2.0 możesz użyć DateTimeklasy i określić strefę czasową UTC za pomocą instancji DateTimeZone.

Dokumentacja DateTime __construct () sugeruje przekazanie „now” jako pierwszego parametru podczas tworzenia instancji DateTime i określania strefy czasowej w celu uzyskania aktualnego czasu.

$date_utc = new \DateTime("now", new \DateTimeZone("UTC"));

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
Jessedc
źródło
3
Dokumentacja DateTime __construct () nie sugeruje już pominięcia pierwszego parametru w celu uzyskania aktualnego czasu. Teraz mówi, że powinieneś użyć ciągu „teraz”.
PaulSkinner
Dzięki @PaulSkinner, poprawiłem odpowiedź.
Jessedc
Dzięki, do czego służyły wcześniej ukośniki odwrotne DateTime? Uruchamiam go sam, wydaje się, że działa dobrze bez nich.
Śnieg
1
@Snow Jeśli ten kod zostanie wstawiony do kodu z przestrzenią nazw, powiedzmy, że twój plik ma namespace Adeklarację na górze, PHP założy , że DateTimeodwołuje się do A\DateTime, co jest błędne. Dodanie ukośnika odwrotnego rozwiązuje problem. Moim zdaniem to dobry nawyk, nawet jeśli nie używasz jeszcze przestrzeni nazw.
Niavlys
35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
Sudhir Bastakoti
źródło
3
@AlainTiemblo nie całkiem; musisz odjąć przesunięcie, aby działało
sanmai
14
date("Y-m-d H:i:s", time() - date("Z"))
Allanrbo
źródło
14

Uzyskanie daty UTC

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

Uzyskanie znacznika czasu UTC

time();

Wynik nie będzie inny, nawet jeśli masz date_default_timezone_setna swoim kodzie.

StefansArya
źródło
@ زياد Dzięki za korektę, zmodyfikowałem odpowiedź
StefansArya
Myślałem, że gmdate () zwraca GMT, a nie UTC. „Identyczna z funkcją date (), z tą różnicą, że zwracany czas to Greenwich Mean Time (GMT)”. Czy coś mi brakuje? Czy te są równoważne?
Jordan
3
@Jordan W praktyce UTC i GMT reprezentują ten sam czas. stackoverflow.com/questions/48942916/…
martti
12

Oprócz dzwonienia gmdatemożesz również umieścić ten kod przed resztą kodu:

<?php
date_default_timezone_set("UTC");
?>

Spowoduje to, że pozostałe połączenia związane z datą / godziną będą używać strefy czasowej GMT / UTC.

anubhava
źródło
Już nie w najnowszych wersjach PHP.
Khom Nazid
1
@KhomNazid „UTC” jako parametr jest nadal ważny. php.net/manual/en/ ...
Harikrishna
6

Możesz użyć funkcji gmmktime bez argumentów, aby uzyskać aktualny znacznik czasu UTC:

$time = gmmktime();
echo date("Y-m-d H:i:s", $time); 

gmmktime będzie działać tylko wtedy, gdy czas twojego serwera korzysta z UTC. Na przykład mój serwer jest ustawiony na Stany Zjednoczone / Pacyfik. wymieniona powyżej funkcja przypomina czas pacyficzny.

RicoRico
źródło
Funkcja gmmktime () jest przestarzała
Jonny
2

z ciągiem GMT / UTC +/- 0400 lub GMT / UTC +/- 1000 w oparciu o lokalne czasy

Brakuje Twojego niestandardowego formatu,O aby uzyskać przesunięcie strefy czasowej od czasu lokalnego.

Różnica w stosunku do czasu Greenwich (GMT) w godzinach Przykład: +0200

date_default_timezone_set('America/La_Paz');
echo date('Y-m-d H:i:s O');

2018-01-12 12:10:11 -0400

Jednak w celu zmaksymalizowania przenośności / interoperacyjności zalecałbym korzystanie z formatu daty ISO8601c

date_default_timezone_set('America/La_Paz');
echo date('c');

2018-01-12T12: 10: 11-04: 00

date_default_timezone_set('Australia/Brisbane');
echo date('c');

2018-01-13T02: 10: 11 + 10: 00

Możesz użyć również, gmdatea łańcuch przesunięcia strefy czasowej zawsze będzie+00:00

date_default_timezone_set('America/La_Paz');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

date_default_timezone_set('Australia/Brisbane');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

Jeff Puckett
źródło
1

Możesz użyć następujących, aby uzyskać czas UTC:

date_default_timezone_set('Asia/Calcutta');

$current_date = date("Y/m/d g:i A");

$ist_date = DateTime::createFromFormat(
                        '"Y/m/d g:i A"',
                        $current_date,
                        new DateTimeZone('Asia/Calcutta')
                    );

$utc_date = clone $ist_date;
$utc_date->setTimeZone(new DateTimeZone('UTC'));

echo 'UTC:  ' . $utc_date->format('Y-m-d g:i A');
Dalip
źródło
0
/**
     * Converts a local Unix timestamp to GMT
     *
     * @param   int Unix timestamp
     * @return  int
     */
    function local_to_gmt($time = '')
    {
        if ($time === '')
        {
            $time = time();
        }

        return mktime(
            gmdate('G', $time),
            gmdate('i', $time),
            gmdate('s', $time),
            gmdate('n', $time),
            gmdate('j', $time),
            gmdate('Y', $time)
        );
    }
realmag777
źródło
0

Poniżej znajdź kod PHP, aby uzyskać aktualny czas UTC (uniwersalny czas koordynowany)

<?php
// Prints the day
echo gmdate("l") . "<br>";

// Prints the day, date, month, year, time, AM or PM
echo gmdate("l jS \of F Y h:i:s A");
?>

Shivasagar
źródło