6 Soru: PHP'de Greenwich Mean Time'ı nasıl edinebilirim?

tarafından oluşturulan soru Tue, Feb 18, 2014 12:00 AM

EST'ye ayarlanmış bir sunucum var ve veritabanındaki tüm kayıtlar EST'ye ayarlanmış. GMT'ye nasıl ayarlanacağını bilmek istiyorum. Kullanıcılarıma bir saat dilimi seçeneği sunmak istiyorum.

    
44
6 Yanıtlar                              6                         

Sunucunun hangi GMT saat dilimi olduğu önemli değildir, burada herhangi bir saat dilimi için saat ve tarih almanın son derece kolay bir yoludur. Bu, time() ve gmdate() işlevleriyle yapılır. gmdate() işlevi normalde bize GMT zamanını verir, ancak time() işleviyle bir numara yaparak GMT + N veya GMT-N değerlerini alabiliriz, bu da herhangi bir GMT saat dilimi için zaman alabileceğimiz anlamına gelir.

Örneğin, GMT + 5 için zaman ayırmanız gerekiyorsa, bunu aşağıdaki şekilde yapabilirsiniz

 
<?php 
  $offset=5*60*60; //converting 5 hours to seconds.
  $dateFormat="d-m-Y H:i";
  $timeNdate=gmdate($dateFormat, time()+$offset);
?>

Şimdi eğer GMT-5’e zaman ayırmanız gerekiyorsa, ofseti sadece eklemek yerine time()’dan çıkarabilirsiniz, aşağıdaki örnekte olduğu gibi GMT-4’e zaman ayıracağız

 
<?php 
  $offset=4*60*60; //converting 4 hours to seconds.
  $dateFormat="d-m-Y H:i"; //set the date format
  $timeNdate=gmdate($dateFormat, time()-$offset); //get GMT date - 4
?>
    
47
2016-01-10 12: 37: 35Z
  1. Cevabınız için teşekkürler
    2009-05-12 07: 58: 50Z
  2. Bu iyi bir örnektir ... ancak çıkartılması veya gmdate saatine eklenmesi gereken zamanı nasıl bilebilirim?
    2012-10-10 06: 02: 55Z
  3. Bu cevap yanlıştır, çünkü time () işlevi sunucunun yerel saatini alacaktır. UTC almayacağından, sunucu saatinin ne olduğunu bilmiyorsanız, beklenen saat dilimi saatini alamazsınız.
    2014-10-21 07: 02: 31Z
  4. bu cevap eski ve garip sonuçlar üretecek
    2015-07-03 17: 45: 34Z
  5. Bu, GMT ofsetini $offset=5*60*60 kodunda sabit kodlamanızı gerektirir. İdeal değil, özellikle gün ışığından tasarrufları veya saat dilimlerini kapsayan sunucu kümelerini hesaba katmanız gerekirse.
    2016-08-24 16: 02: 08Z

şiddetle , farklı bir saat dilimi gibi görünmesi için UNIX zaman damgalarıyla uğraşmaktan kaçınmayı öneririm. Bu zor bir yoldan öğrendim, pek çok kez.

Zaman damgası, 1 Ocak 1970 Gece Yarısı GMT'den bu yana geçen saniye sayısıdır. Dünyanın neresinde olduğunuzun önemi yoktur, verilen bir zaman damgası, zaman diliminden bağımsız olarak zaman içindeki aynı anı temsil eder. Evet, "0" zaman damgası, Avustralya’da 10:00 /1 /70’de, Londra’da Gece Yarısı 1/1 /70’inde ve LA’de 05/12 /69’da saat 19: 00’a karşılık gelir; doğruluğu.

Her yıl beni çok uzun bir süredir dolduran altın örnek, gün ışığından yararlanma miktarının artacağıydı. Gün ışığından yararlanma, dünyanın belirli bölgelerinde olmayan "saat süreleri" olduğu anlamına gelir. Örneğin, ABD’nin çoğu yerinde 2 Nisan 2006’da saat 02:01 gibi bir zaman yoktu.

Yeterince yarı anlaşılır ranting olsa da. Tavsiyem, tarihleri ​​bir zaman damgası olarak veritabanında saklamak ve sonra ...

Örneğin,

 
$timestamp = time();

echo "BRISBANE: " . date('r', $timestamp) . "\n";
echo "     UTC: " . gmdate('r', $timestamp) . "\n";
date_default_timezone_set('Africa/Johannesburg');
echo "  JOBURG: " . date('r', $timestamp) . "\n";

// BRISBANE: Tue, 12 May 2009 18:28:20 +1000
//      UTC: Tue, 12 May 2009 08:28:20 +0000
//   JOBURG: Tue, 12 May 2009 10:28:20 +0200

Bu, değerlerinizi temiz tutar (ofset ekleme konusunda endişelenmenize gerek kalmadan ve kaydetmeden önce çıkarmanız gerekir), tüm Günışığı Tasarruf kurallarına saygı gösterir ve ayrıca saat dilimine bile bakmanıza gerek kalmaz İstediğiniz yerin.

    
69
2009-05-12 08: 32: 11Z
  1. "en azından saat dilimi kayması değişinceye kadar, Yaz Saati Uygulaması nedeniyle veya ne olursa olsun." ... ve benim çözümümün berbat olduğunu mu söylüyorsunuz?
    2009-09-06 01: 05: 03Z
  2. "bunu yapabilen bir PHP kütüphanesi" - yerleşiktir. "ya politikacılar kuralları değiştirirse" - iyi: hiçbirini değiştirmek zorunda kalmazsın kod - PHP güncel tutulursa, o zaman işe yarayacak. "Yerel tarihi alan başka bir kodunuz varsa" - durulayın ve tekrarlayın.
    2009-09-15 01: 21: 45Z
  3. nickf çok acıtıyor. Zaman dilimi ofset hesaplamalarını kendiniz yapmak zorunda kalmaktan kaçınmak için HERHANGİ BİR Kütüphane veya İşletim Sistemi çağrısına güvenmek istersiniz. Nickf'e benzer şekilde, ben de bunu zor yoldan öğrendim.
    2011-10-20 06: 31: 35Z
  4. İşte burada! Bu konuyla ilgilenen herkes bu çözümü kullanmalıdır. Her iki cevap da iyidir, ancak bu iki cevaptan daha iyidir. Sadece n3wbs 'i karıştırabilir diye yanlış bir çözüm yapmaz. Teşekkürler Nickf! Yan not: nickf’de repk 78k, p01nd3xt3r ise 62’de. Bu hem kullanıcılar hem de masaya ne getirdikleri hakkında çok şey söylüyor.
    2011-12-06 15: 02: 29Z
  5. @ J.Bruni sorun tam olarak neydi? Hemen hemen her programlama dili (artı bildiğim her SQL uygulaması), bir zaman damgasını bir tarih ve saate dönüştürmek için yerleşik yöntemler kullanır.
    2012-01-27 22: 28: 46Z

Veritabanında depolanan bir tarihi, tarih damgasını ikinci argüman olarak zaman damgası olarak verdiğiniz bir tarihi dönüştürmek için tarih ('Z') kullanıyorsanız, aksi takdirde sonucunuzun doğru olmayacağını unutmayın.

/p>

örn.

İngiltere'de bazen tarih ('Z') 3600, bazen 0 verir.

 
echo date('Z', strtotime('2012-01-01'));

0 verir

 
echo date('Z', strtotime('2012-07-01'));

3600 verir

Yani sadece strtotime ($dbDateValue) kullanarak - date ('Z') yanlış olabilir

Bunun yerine kullanın:

 
$dbDateTimestamp = strtotime($dbDateValue); // where $dbDateValue something like 2012-01-01 22:34:00

$utcTimestamp = strtotime($dbDateTimestamp) - date('Z', $dbDateTimestamp);

Bu, elbette ki PHP'ye ve veritabanının aynı saat dilimine ayarlanmış olmasına bağlıdır.

    
4
2012-07-12 11: 32: 31Z

İşte GMT’den farklı saat dilimlerinin bir listesi, bunun yararlı olacağını umuyoruz!

 
echo '<pre>';
$zones_array = array();        
$timestamp = time();         
# to maintain the original timezone, store before
$default_timezone = date_default_timezone_get();
foreach (timezone_identifiers_list() as $key => $zone) {    
    date_default_timezone_set($zone);
    $zones_array[$key]['zone'] = $zone;
    $zones_array[$key]['diff_from_GMT'] = date('P', $timestamp);
}
# to maintain the original timezone, re-set after
date_default_timezone_set($default_timezone);    
print_r($zones_array);

teşekkürler!

    
4
2014-02-28 18: 39: 02Z
  1. İnsanlar düzenlemeleri hiç reddetti mi veya insanlar spam göndermeyi onaylıyor mu? Şunu söylerdim ... "Bu düzenleme yanlış veya mevcut yayına yanıt verme veya yorum yapma girişimi."
    2014-02-28 18: 42: 37Z
  2. Kusuru göremiyorum, belirli olabilir misiniz?
    2014-02-28 19: 43: 10Z
  3. Ow Anladım. Bir miktar anlayış arayışı içindeydim ve bunu görmeyi bitirdim ve düzeltmenin en iyisi olduğunu düşündüm. Eğer sadece benim dikkat çekmek istediğimi söylüyorsanız. Çözüm için olsaydı ... Peki açıklar mısın? Öğrenmekten mutlu olurum ...
    2014-02-28 20: 39: 11Z

Bir zaman damgasını gereken zaman dilimine dönüştürmek için alternatif bir işlev yazmak için bu sorudan ilham aldım.

Öyleyse, CORRECT prosedürü zaman kaydetme, görüntüleme (dönüştürme) zamanını izler:

 
1) record timestamp with time()
2) If you need to get a different timezone, use:
   2.1) Class based:
       2.1.1) DateTime class + setTimezone
       or
       2.1.2) date_default_timezone_set() and then date()

       2.1.1) is better and more flexible than 2.1.2)

    Function:

      function getLTime_class($ts, $uTZ, $format_str="Y.m.d H:i", $sTZ="America/Toronto"){
        // $ts - timestamp recorded with time(); if have date => convert to timestamp: strtotime($date_input); //for ex strtotime('2012-02-17 12:00:00'); => 1345219200 - same value for summer and winter (for toronto timezone);
        // $uTZ - TZ string (ex: 'America/Toronto'); convert timestamp to this TimeZone
        // $sTZ - TZ string (ex: 'America/Toronto'); convert timestamp from this TimeZone
        $TimeZone_server=new DateTimeZone($sTZ);
        $date_obj=new DateTime("@$ts", $TimeZone_server);
        $TimeZone_local=new DateTimeZone($uTZ);
        $date_obj->setTimeZone($TimeZone_local);
        return $date_obj->format($format_str);
      }

    Usage:

     $date_input=$_POST['date_input']; //read from POST
     $ts=strtotime($date_input); //for ex strtotime('2012-02-17 12:00:00'); => 1345219200 - same value for summer and winter (for toronto timezone);
     $userTZ='America/Toronto'; //read from user params
     $result=getLTime_class($ts, $userTZ, 'Y-m-d H:i:s');


   2.2) Non-Class based:

Function:

      //this function replaces the function with DateTime class. It's faster. $uTZoffset is integer.
      function getLTime_nonclass($ts, $uTZoffset, $format_str="Y.m.d H:i"){
        // $ts - timestamp recorded with time(); if have date => convert to timestamp: strtotime($date_input); //for ex strtotime('2012-02-17 12:00:00'); => 1345219200 - same value for summer and winter (for toronto timezone);
        // $uTZoffset - TZ offset (integer) $uTZoffset must consider DTS (for ex: in summer $uTZoffset=-4; in winter $uTZoffset=-5)
        $ts_offset=date('Z',$ts);
        if ($uTZoffset) $add_offset=$ts_offset-date('Z'); //when not UTC
        else $add_offset=0; //when UTC
        return date($format_str,$ts-$ts_offset+$uTZoffset*3600+$add_offset);
      }

    Usage:

     $date_input=$_POST['date_input']; //read from POST
     $ts=strtotime($date_input); //for ex strtotime('2012-02-17 12:00:00'); => 1345219200 - same value for summer and winter (for toronto timezone);
     $uTZoffset=-4; //read from user params. $uTZoffset - TZ offset (integer) $uTZoffset must consider DTS (for ex: in summer $uTZoffset=-4; in winter $uTZoffset=-5)
     $result=getLTime_nonclass($ts, $uTZoffset, 'Y-m-d H:i:s');

Sonuçlar:

$date_input = 2012-08-17 12:00:00

 
Server date: summer (2013-08-26)
    getLTime_class      =>  $userTZ='America/Toronto'   =>  2012-08-17 12:00:00
    getLTime_nonclass   =>  $uTZoffset=-4               =>  2012-08-17 12:00:00
    getLTime_class      =>  $userTZ='UTC'               =>  2012-08-17 16:00:00
    getLTime_nonclass   =>  $uTZoffset=0                =>  2012-08-17 16:00:00

Server date: winter (2013-02-26)
    getLTime_class      =>  $userTZ='America/Toronto'   =>  2012-08-17 12:00:00
    getLTime_nonclass   =>  $uTZoffset=-5               =>  2012-08-17 12:00:00
    getLTime_class      =>  $userTZ='UTC'               =>  2012-08-17 16:00:00
    getLTime_nonclass   =>  $uTZoffset=0                =>  2012-08-17 16:00:00

$date_input = 2012-02-17 12:00:00

 
Server date: summer (2013-08-26)
    getLTime_class      =>  $userTZ='America/Toronto'   =>  2012-02-17 12:00:00
    getLTime_nonclass   =>  $uTZoffset=-4               =>  2012-02-17 12:00:00
    getLTime_class      =>  $userTZ='UTC'               =>  2012-02-17 17:00:00
    getLTime_nonclass   =>  $uTZoffset=0                =>  2012-02-17 17:00:00

Server date: winter (2013-02-26)    
    getLTime_class      =>  $userTZ='America/Toronto'   =>  2012-02-17 12:00:00
    getLTime_nonclass   =>  $uTZoffset=-5               =>  2012-02-17 12:00:00
    getLTime_class      =>  $userTZ='UTC'               =>  2012-02-17 17:00:00
    getLTime_nonclass   =>  $uTZoffset=0                =>  2012-02-17 17:00:00 

Dönüşüm falan yapmayı umarak LTime_nonclass'ı almaya karar verdimsınıfları kullanarak daha ster. Tek istediğim getLTime_nonclass'ın getLTime_class için geçerli bir alternatif olduğunu onaylamak. Lütfen düşüncenizi açıklamaktan çekinmeyin. Teşekkür

    
1
2013-08-26 19: 48: 18Z

DB'de GMT + 0'da gerekli kayıt süresi gerektiğinde görev var ancak işlev süresi () sunucunun zamanını döndürüyor. Bir sonraki fonksiyonla mümkün çözümü:

 
/**
     * 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
2016-05-24 14: 18: 25Z
kaynak yerleştirildi İşte