dapatkan waktu UTC di PHP

122

Bagaimana saya bisa mendapatkan stempel waktu UTC / GMT +/- menggunakan fungsi tanggal () PHP? Misalnya jika saya coba

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

Saya akan mendapatkan cap waktu Unix; tetapi saya perlu mendapatkan stempel waktu UTC / GMT dengan string GMT / UTC +/- 0400 atau GMT / UTC +/- 1000 berdasarkan waktu lokal.

Robin Michael Poothurai
sumber
1
@JeffPuckettII GMT tidak berubah untuk penghematan siang hari. Inggris berubah dari GMT menjadi BST di musim panas, tetapi GMT tetap sama dan selalu cocok dengan UTC.
lewis

Jawaban:

111

Menggunakan gmdateakan selalu mengembalikan tanggal GMT. Sintaksnya sama dengan for date.

nikc.org
sumber
12
@sanmai: stempel waktu Unix menurut definisi selalu UTC. en.wikipedia.org/wiki/Unix_time
nikc.org
1
@ nikc.org: Masalahnya adalah gmdate ("U"), mengembalikan sama seperti waktu () yang bukan stempel waktu UTC jika zona waktu sistem server Anda berbeda. Satu-satunya cara saya bisa mendapatkan stempel waktu berbasis UTC adalah strtotime (gmdate ("M d YH: i: s")), yang berbeda dengan gmdate ("U"), ketika zona waktu sistem server Anda berbeda dari UTC
bksi
@bksi Saya tidak dapat mengulangi perilaku yang Anda jelaskan. (Mesin saya tidak pada GMT dan stempel waktu UNIX saya benar. Juga gmdate("U") == time().) Kedengarannya seperti perilaku berpotensi buggy. Periksa kembali dan laporkan bug dengan proyek PHP.
nikc.org
Saya menggunakan skrip php sederhana untuk menguji skenario: <? waktu gema (). "===" .strtotime (gmdate ("M d YH: i: s")). "Zona Waktu:" .date ("Z"). "\ n"; ?> Ketika saya menjalankannya saya mendapatkan hasil ini: 1456342082 === 1456338482 Zona waktu: 3600 Hasil tanggal perintah shell adalah: Rabu 24 Feb 20:28:11 CET 2016
bksi
1
@bksi - Mungkin Anda bingung representasi internal datetime dengan representasi eksternal datetime? waktu w / oa penentu zona vs waktu dengan penentu zona? Seperti yang dikatakan nikc (dan dokumentasi), time()mengembalikan "jumlah detik sejak Unix Epoch (1 Januari 1970 00:00:00 GMT)". Catatan GMT. Fakta bahwa secara default sistem Anda mengubahnya menjadi zona waktu Anda untuk tampilan, adalah kenyamanan pengguna. Secara internal, selalu GMT.
ToolmakerSteve
90

Sebuah gmdate () sederhana sudah cukup

<?php
print gmdate("Y-m-d\TH:i:s\Z");
Shankar Damodaran
sumber
47

Seperti yang dijawab sebelumnya di sini , karena PHP 5.2.0 Anda dapat menggunakan DateTimekelas dan menentukan zona waktu UTC dengan turunan DateTimeZone.

Dokumentasi DateTime __construct () menyarankan untuk meneruskan "sekarang" sebagai parameter pertama saat membuat instance DateTime dan menentukan zona waktu untuk mendapatkan waktu saat ini.

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

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
Jessedc
sumber
3
Dokumentasi DateTime __construct () tidak lagi menyarankan untuk menghilangkan parameter pertama untuk mendapatkan waktu saat ini. Sekarang dikatakan Anda harus menggunakan string 'sekarang'.
PaulSkinner
Terima kasih @PaulSkinner, saya telah mengubah jawabannya.
Jessedc
Terima kasih, apa tujuan dari garis miring terbalik sebelumnya DateTime? Menjalankannya sendiri, sepertinya berfungsi dengan baik tanpa mereka.
Salju
1
@Snow Jika kode ini dimasukkan ke dalam kode spasi nama, katakanlah file Anda memiliki namespace Adeklarasi di bagian atas, PHP akan menganggap DateTimemerujuk ke A\DateTime, yang salah. Menambahkan garis miring terbalik memperbaiki masalah tersebut. Ini adalah kebiasaan yang baik untuk dilakukan bahkan jika Anda belum menggunakan namespace, menurut saya.
Niavlys
35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
Sudhir Bastakoti
sumber
3
@AlainTiemblo kurang tepat; Anda perlu mengurangi offset agar berfungsi
sanmai
14
date("Y-m-d H:i:s", time() - date("Z"))
Allanrbo
sumber
14

Mendapatkan tanggal UTC

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

Mendapatkan cap waktu UTC

time();

Hasilnya tidak akan berbeda bahkan yang Anda miliki date_default_timezone_setpada kode Anda.

StefansArya
sumber
@ زياد Terima kasih atas koreksinya, saya telah mengubah jawaban saya
StefansArya
Saya pikir gmdate () mengembalikan GMT dan bukan UTC. "Identik dengan fungsi date () kecuali waktu yang dikembalikan adalah Greenwich Mean Time (GMT)". Apakah saya melewatkan sesuatu? Apakah hasilnya sama?
Yordania
3
@Jordan Dalam praktiknya UTC dan GMT mewakili waktu yang sama. stackoverflow.com/questions/48942916/…
martti
12

Selain menelepon, gmdateAnda juga dapat meletakkan kode ini sebelum kode lainnya:

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

Itu akan membuat sisa panggilan terkait tanggal / waktu Anda untuk menggunakan zona waktu GMT / UTC.

anubhava.dll
sumber
Tidak lagi di versi PHP terbaru.
Khom Nazid
1
@KomNazid "UTC" sebagai parameter masih valid. php.net/manual/en/…
Harikrishna
6

Anda dapat menggunakan fungsi gmmktime tanpa argumen untuk mendapatkan stempel waktu UTC saat ini:

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

gmmktime hanya akan berfungsi jika waktu server Anda menggunakan UTC. Misalnya, server saya disetel ke AS / Pasifik. fungsi yang tercantum di atas bergema kembali waktu Pasifik.

RicoRico
sumber
gmmktime () tidak digunakan lagi
Jonny
2

dengan string GMT / UTC +/- 0400 atau GMT / UTC +/- 1000 berdasarkan waktu lokal

Format kustom Anda hilang Ountuk memberi Anda offset zona waktu dari waktu lokal.

Selisih waktu Greenwich (GMT) dalam jam Contoh: +0200

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

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

Namun, untuk portabilitas / interoperabilitas yang dimaksimalkan, saya akan merekomendasikan menggunakan format tanggal ISO8601c

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

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

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

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

Anda juga dapat menggunakan gmdatedan string offset zona waktu akan selalu seperti itu+00:00

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

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

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

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

Jeff Puckett
sumber
1

Anda dapat menggunakan yang berikut untuk mendapatkan waktu 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
sumber
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
sumber
0

Di bawah ini temukan kode PHP untuk mendapatkan waktu UTC (Waktu Universal Terkoordinasi) saat ini

<?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
sumber