PHP'de UTC saati alın


122

PHP'nin date () işlevini kullanarak UTC / GMT +/- zaman damgasını nasıl alabilirim? Örneğin, denersem

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

Unix zaman damgası alacağım; ancak yerel zamanlamalara göre GMT / UTC +/- 0400 veya GMT / UTC +/- 1000 dizeli UTC / GMT zaman damgasını almam gerekiyor.


1
@JeffPuckettII GMT, gün ışığından yararlanma için değişmez. İngiltere, Yaz aylarında GMT'den BST'ye değişir, ancak GMT aynı kalır ve her zaman UTC ile eşleşir.
lewis

Yanıtlar:


111

Kullanmak gmdateher zaman bir GMT tarihi döndürür. Sözdizimi ile aynıdır date.


12
@sanmai: Unix zaman damgası tanımı gereği her zaman UTC'dir. en.wikipedia.org/wiki/Unix_time
nikc.org

1
@ nikc.org: Sorun, gmdate ("U"), sunucu sistem saat diliminiz farklıysa UTC zaman damgası olmayan time () ile aynı döndürmesidir. Gerçek UTC tabanlı zaman damgası alabilmemin tek yolu strtotime (gmdate ("M d YH: i: s")) idi, bu da sunucu sisteminizin saat diliminiz UTC'den farklı olduğunda gmdate'den ("U") farklıdır
bksi

@bksi Açıkladığın davranışı tekrarlayamıyorum. (Makinem GMT'de değil ve UNIX zaman damgalarım da doğru gmdate("U") == time().) Olası hatalı davranış gibi görünüyor. PHP projesini iki kez kontrol edin ve bir hatayı dosyalayın.
nikc.org

Senaryoyu test etmek için basit php betiği kullandım: <? echo time (). "===" .strtotime (gmdate ("M d YH: i: s")). "Zaman Dilimi:" .tarih ("Z"). "\ n"; ?> Çalıştırdığımda şu sonucu alıyorum: 1456342082 === 1456338482 Saat dilimi: 3600 Shell komut tarihinin sonucu: 24 Şubat Çarşamba 20:28:11 CET 2016
bksi

1
@bksi - Belki de datetime'ın dahili temsilini datetime'ın harici gösterimiyle karıştırıyorsunuzdur? bölge belirleyicisiz saat vs bir bölge belirleyicili saat? Nikc'in (ve belgelerin) dediği gibi, time()"Unix Epoch'tan ( 1 Ocak 1970 00:00:00 GMT) bu yana geçen saniye sayısını" döndürür. Not GMT. Varsayılan olarak sisteminizin bunu görüntüleme için saat diliminize dönüştürmesi bir kullanıcı rahatlığıdır. Dahili olarak, her zaman GMT'dir.
ToolmakerSteve


47

Daha önce burada yanıtlandığı gibi , PHP 5.2.0'dan beri DateTimesınıfı kullanabilir ve UTC saat dilimini bir örneği ile belirtebilirsiniz DateTimeZone.

DateTime __construct () belgeleri , bir DateTime örneği oluştururken ve geçerli saati almak için bir saat dilimi belirtirken "now" ın ilk parametre olarak geçirilmesini önerir.

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

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC

3
DateTime __construct () belgeleri artık geçerli saati almak için ilk parametrenin çıkarılmasını önermiyor. Şimdi bir 'şimdi' dizesi kullanmanız gerektiğini söylüyor.
PaulSkinner

Teşekkürler @ PaulSkinner, cevabı değiştirdim.
Jessedc

Teşekkürler, önceki ters eğik çizgilerin amacı DateTimenedir? Kendim çalıştırıyorum, onlar olmadan gayet iyi çalışıyor gibi görünüyor.
Kar

1
Bu kod isim alanlı koduna eklenir Eğer senin dosyası vardır diyelim @Snow namespace Aüstündeki beyanı PHP üstlenecek DateTimebaşvurmak için A\DateTimeyanlış olan. Ters eğik çizgi eklemek sorunu çözer. Henüz ad alanlarını kullanmasanız bile almak iyi bir alışkanlık bence.
Niavlys

35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);

3
@AlainTiemblo pek değil; Çalışması için ofseti çıkarmanız gerekiyor
sanmai


14

UTC tarihinin alınması

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

UTC zaman damgası alma

time();

date_default_timezone_setKodunuz olsa bile sonuç farklı olmayacaktır .


@ زياد Düzeltme için teşekkürler, cevabımı değiştirdim
StefansArya

Gmdate () işlevinin UTC'yi değil GMT'yi döndürdüğünü düşündüm. "Döndürülen saatin Greenwich Ortalama Saati (GMT) olması dışında date () işleviyle aynıdır". Bir şey mi kaçırıyorum? Bunlar eşdeğer mi çıkıyor?
Ürdün

3
@Jordan Pratikte UTC ve GMT aynı zamanı temsil eder. stackoverflow.com/questions/48942916/…
martti

12

Aramadan başka gmdatebu kodu kodun geri kalanının önüne de koyabilirsiniz:

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

Bu, tarih / saatle ilgili geri kalan çağrılarınızın GMT / UTC saat dilimini kullanmasını sağlayacaktır.


Artık PHP'nin son sürümlerinde değil.
Khom Nazid

1
@KhomNazid "UTC" bir parametre olarak hala geçerlidir. php.net/manual/en/…
Harikrishna

6

Geçerli UTC zaman damgasını elde etmek için gmmktime işlevini bağımsız değişkenler olmadan kullanabilirsiniz :

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

gmmktime yalnızca sunucu saatiniz UTC kullanılıyorsa çalışır. Örneğin, sunucum ABD / Pasifik olarak ayarlandı. yukarıda listelenen işlev, Pasifik saatini geri yansıtır.


gmmktime () kullanımdan kaldırıldı
Jonny

2

yerel zamanlamalara göre GMT / UTC +/- 0400 veya GMT / UTC +/- 1000 dizisi ile

Size yerel saatten saat dilimi farklarını vermek için özel biçiminiz eksik O.

Saat cinsinden Greenwich zamanı (GMT) farkı Örnek: +0200

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

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

Bununla birlikte, maksimum taşınabilirlik / birlikte çalışabilirlik için ISO8601 tarih biçimini kullanmanızı tavsiye ederim.c

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

Ayrıca kullanabilirsiniz gmdateve saat dilimi uzaklığı dizesi her zaman+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


1

UTC saatini almak için aşağıdakileri kullanabilirsiniz:

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

Geçerli UTC (Koordineli Evrensel Zaman) saatini almak için PHP kodunu aşağıda bulabilirsiniz

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.