2010-03-24 23 views

risposta

85

È possibile utilizzare l'oggetto datetime o loro alias funzione per questo:

Example (abridged from PHP Manual)

date_default_timezone_set('Europe/London'); 

$datetime = new DateTime('2008-08-03 12:35:23'); 
echo $datetime->format('Y-m-d H:i:s') . "\n"; 
$la_time = new DateTimeZone('America/Los_Angeles'); 
$datetime->setTimezone($la_time); 
echo $datetime->format('Y-m-d H:i:s'); 

Modifica per quanto riguarda i commenti

ma ho cannt utilizzare questo metodo perché ho bisogno di mostrare la data in fusi orari diversi come noi accesso da diverse località

Questo non è un problema. Quando un utente effettua l'accesso, determina il suo fuso orario e lo imposta sull'oggetto DateTime come mostrato. Sto usando un approccio simile in uno dei miei progetti e funziona come un fascino.

nel database ho bisogno di ottenere le date in ogni singolo fuso orario, solo allora si può essere elaborato correttamente

memorizzare il tempo sia come un timestamp o un datetime in un fuso orario. Quando si esegue una query su un campo DateTime, si converte l'ora in un oggetto DateTime in questo fuso orario o, se il db lo supporta, si esegue una query con il fuso orario selezionato.

+0

grazie Gordon ma ho cannt utilizzare questo metodo, perché ho bisogno di mostrare la data in fusi orari diversi come l'accesso utente da posizioni diverse – raki

+0

@raki: così solo dopo che l'utente è loggato - imposta date_default_timezone_set() con il fuso orario selezionato dell'utente corretto. – zerkms

+0

anche questo non è possibile .. perché .. nel database ho bisogno di ottenere le date in un singolo fuso orario, quindi solo esso può essere elaborato correttamente – raki

9

Un metodo ancora più semplice assomiglia a questo:

date_default_timezone_set('Europe/London'); // your user's timezone 
$my_datetime='2013-10-23 15:47:10'; 
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC")); 

Come descritto in the PHP manual, strtotime() accetta un fuso orario troppo, basta aggiungerlo alla vostra datetime.

Ti consiglio di memorizzare tutti i tuoi dati in UTC perché in questo modo non avrai problemi con l'ora legale.

9

Questo ha funzionato per me ed è anche abbastanza pulito!

function convert_to_user_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') 
{ 
    try { 
     $dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone)); 
     $dateTime->setTimezone(new DateTimeZone($userTimeZone)); 
     return $dateTime->format($format); 
    } catch (Exception $e) { 
     return ''; 
    } 
} 

function convert_to_server_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') 
{ 
    try { 
     $dateTime = new DateTime ($date, new DateTimeZone($userTimeZone)); 
     $dateTime->setTimezone(new DateTimeZone($serverTimeZone)); 
     return $dateTime->format($format); 
    } catch (Exception $e) { 
     return ''; 
    } 
} 

//example usage 
$serverDate = $userDate = '2014-09-04 22:37:22'; 
echo convert_to_user_date($serverDate); 
echo convert_to_server_date($userDate); 
4

DateTime::setTimezone -- date_timezone_set — Sets the time zone for the DateTime object

Object Oriented stile

<?php 
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru')); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 

$date->setTimezone(new DateTimeZone('Pacific/Chatham')); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 
?> 

stile procedurale

<?php 
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru')); 
echo date_format($date, 'Y-m-d H:i:sP') . "\n"; 

date_timezone_set($date, timezone_open('Pacific/Chatham')); 
echo date_format($date, 'Y-m-d H:i:sP') . "\n"; 
?> 

Gli esempi di cui sopra sarà:

2000-01-01 00:00:00+12:00 
2000-01-01 01:45:00+13:45 
0
<?php 
$time='6:02'; 
$dt = new DateTime($time, new DateTimeZone('America/New_York')); 
//echo $dt->format('Y-m-d H:i:s') . PHP_EOL; 
$dt->setTimezone(new DateTimeZone('Asia/Kolkata')); 
echo $dt->format('H:i') . PHP_EOL; 
?> 
0

// Convertire la data da una zona a un'altra .. /* $ zone_from = 'Asia/Kolkata';

$zone_to='America/Phoenix'; 

date_default_timezone_set($zone_from); 

$convert_date="2016-02-26 10:35:00"; 

echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to); 

*/ 
function zone_conversion_date($time, $cur_zone, $req_zone) 
{ 
    date_default_timezone_set("GMT"); 
    $gmt = date("Y-m-d H:i:s"); 

    date_default_timezone_set($cur_zone); 
    $local = date("Y-m-d H:i:s"); 

    date_default_timezone_set($req_zone); 
    $required = date("Y-m-d H:i:s"); 

    /* return $required; */ 
    $diff1 = (strtotime($gmt) - strtotime($local)); 
    $diff2 = (strtotime($required) - strtotime($gmt)); 

    $date = new DateTime($time); 
    $date->modify("+$diff1 seconds"); 
    $date->modify("+$diff2 seconds"); 

    return $timestamp = $date->format("Y-m-d H:i:s"); 
} 
1

UTC al locale:

<?php 
$datetime = date("Y-m-d H:i:s"); 
$utc = new DateTime($datetime, new DateTimeZone('UTC')); 
$utc->setTimezone(new DateTimeZone('America/Sao_Paulo')); 
echo $utc->format('Y-m-d H:i:s'); 

?> 
4

Nessuna di queste risposte ha lavorato per me (ho saltato cercando codice che era eccessivamente ingombrante in termini di dimensioni). Penso anche che sia strano cambiare il fuso orario predefinito solo per una singola conversione.

Ecco la mia soluzione:

function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null) 
{ 
    if (empty($timeZoneSource)) { 
    $timeZoneSource = date_default_timezone_get(); 
    } 
    if (empty($timeZoneTarget)) { 
    $timeZoneTarget = date_default_timezone_get(); 
    } 

    $dt = new DateTime($dateString, new DateTimeZone($timeZoneSource)); 
    $dt->setTimezone(new DateTimeZone($timeZoneTarget)); 

    return $dt->format("Y-m-d H:i:s"); 
} 

Così, per convertire al default del server, si sarebbe solo passare un fuso orario:

changeTimeZone("2016-10-24 16:28", "Asia/Tokyo"); 

Per convertire dal default del server per l'utente, è lascerebbe il 2 ° parametro nullo o vuoto:

changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo"); 

E per passare da un fuso orario all'altro lata al default, si dovrebbero fornire 2 fusi orari:

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo"); 
+0

Sembra funzionare bene! –

+1

Bella risposta. Preferisco provare a prendere anziché a (vuoto) per evitare errori di ortografia nella stringa del fuso orario. prova { new DateTimeZone ($ timeZoneSource); } \t catch (Exception $ e) { $ timeZoneSource = date_default_timezone_get(); } –