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.


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.


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


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

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

3
@AlainTiemblo kurang tepat; Anda perlu mengurangi offset agar berfungsi
sanmai


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.


@ زياد 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.


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.


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


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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.