DateTime / DateTimeZone PHP ile saat dilimini ayarlama

3 Cevap php

Orada PHP zaman dilimi ayarlamaları yapmaya bir sürü bilgi var, ama ben nedeniyle tüm gürültü yapmak istiyorum özellikle ne bir cevap bulamadım.

Bir zaman diliminde bir zaman göz önüne alındığında, başka bir zaman diliminde zaman dönüştürmek istiyorum.

This Ben yapmak istediğim aslında, ama ben sadece yerleşik PHP kütüphanelerini değil, ARMUT Tarihi kullanarak bunu yapmak gerekiyor.

Bu benim ne yaptığımı, ama her zaman GMT bana ofset göreceli vermek gibi görünüyor:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles');
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu');

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone);
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM));

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles);
printf("Offset: %s<br/>", $time_offset);

Bu çıkış:

LA Time: 2009-09-18T05:00:00-07:00
Offset: -36000

Ben 3 saat (10800 saniye) bekliyordum. ancak '-7:00' bir şey o bana offset "mutlak" veriyor belki neden açıklıyor GMT göreli her şeyi tutuyor söylüyor.

Nasıl sadece bu GMT hoohah tüm olmadan iki saat dilimleri arasında ofset alabilirim?

Teşekkürler.

GÜNCELLEME:

Ben bunu ve ne istediğinizi alabilir bana oluştu:

    $date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone);
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM));

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone);
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM));


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles);
printf("Offset: %s<br/>", $time_offset);

Ama bu bana garip geliyor. Herkes bunu yapmak için daha temiz bir yol biliyor musun?

3 Cevap

İşte DateTime sınıfları kullanarak fonksiyonların bir çift vardır. Birincisi, iki zaman dilimleri arasındaki saniye farkı dönecektir. İkinci bir zaman dilimi diğerine zaman bir "çeviri" döndürür.

function timezone_diff($tz_from, $tz_to, $time_str = 'now')
{
    $dt = new DateTime($time_str, new DateTimeZone($tz_from));
    $offset_from = $dt->getOffset();
    $timestamp = $dt->getTimestamp();
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset();
    return $offset_to - $offset_from;
}

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
{
    $dt = new DateTime($time_str, new DateTimezone($tz_from));
    $timestamp = $dt->getTimestamp();
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format);
}

Demo:

$los_angeles_time = '2009-09-18 05:00:00';
$los_angeles_tz   = 'America/Los_Angeles';
$hawaii_tz        = 'Pacific/Honolulu';

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time);
echo $los_angeles_hawaii_diff . '<br />';

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time);
echo $hawaii_time . '<br />';

GZipp yorumladı, onun kod sadece PHP> = 5.3.0 için gerçekten. Bu iyi, ama - burada PHP> = 5.2.0 çalışacak bir versiyonu. (Bu arada, o da 5.3 + çalışır, ve 2 daha az fonksiyon çağrıları ile)

<?php
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
{
    $dt = new DateTime($time_str, new DateTimezone($tz_from));
    $dt->setTimezone(new DateTimezone($tz_to));
    return $dt->format($format);
}

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month');

foreach ($time_diffs as $diff)
{
 echo "{$diff}:"
  . "\n\t"
  . "Current: " . date("Y-m-d H:i:s", strtotime($diff))
  . "\n\t"
  . "UTC: " . time_translate("US/Eastern", "UTC", $diff)
  . "\n\n";
}

Bunun için, ikinci bir ilk kez eksi.

Saniye cinsinden zaman farkını almak mümkün olacak.