2010-03-24 5 views

Répondre

85

Vous pouvez utiliser l'objet datetime ou leurs alias de fonction pour cela:

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

Modifier au sujet des commentaires

mais je cannt utiliser cette méthode parce que Je dois montrer la date dans différents fuseaux horaires comme les États-Unis er connexion à partir de différents emplacements

Ce n'est pas un problème. Lorsqu'un utilisateur se connecte, vous déterminez son fuseau horaire et le définissez sur votre objet DateTime, comme indiqué. J'utilise une approche similaire dans l'un de mes projets et cela fonctionne comme un charme.

dans la base de données que je dois obtenir les dates dans un seul fuseau horaire, alors seulement il peut être traité correctement

stocker le temps soit comme un horodatage ou d'un datetime dans un fuseau horaire. Lorsque vous interrogez un champ DateTime, vous convertissez l'heure d'un objet DateTime en ce fuseau horaire ou, si votre base de données le prend en charge, interrogez le fuseau horaire sélectionné.

+0

merci Gordon mais je cannt utiliser cette méthode parce que je dois montrer ce jour dans différents fuseaux horaires que la connexion de l'utilisateur à partir d'emplacements différents – raki

+0

de @raki: si juste après que l'utilisateur est connecté - configurez date_default_timezone_set() avec le fuseau horaire sélectionné par l'utilisateur. – zerkms

+0

ce qui est également impossible .. parce que .. dans la base de données j'ai besoin d'obtenir les dates dans un seul fuseau horaire, alors seulement il peut être traité correctement – raki

9

Une méthode encore plus simple ressemble à ceci:

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

Comme décrit in the PHP manual, strtotime() accepte un fuseau horaire aussi, il vous suffit de l'ajouter à votre datetime.

Je vous recommande de stocker toutes vos dates en UTC car vous n'aurez pas de problème avec l'heure d'été.

9

Cela a fonctionné pour moi et c'est assez propre aussi!

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

objet de style orienté

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

Style procédural

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

Les exemples ci-dessus va afficher:

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

// Convertir la date d'une zone à l'autre. /* $ zone_from = 'Asie/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 au niveau local:

<?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

Aucune de ces réponses a fonctionné pour moi (j'ai sauté le code qui était d'essayer trop volumineux en taille). Je pense aussi que c'est bizarre de changer le fuseau horaire par défaut juste pour une seule conversion.

Voici ma solution:

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

Ainsi, pour convertir la valeur par défaut du serveur, vous simplement passer un fuseau horaire:

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

Pour convertir la valeur par défaut du serveur à l'utilisateur, vous laisserait le deuxième paramètre nul ou vide:

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

et de basculer entre les fuseaux horaires unre lated par défaut, vous fournir 2 fuseaux horaires:

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

Cela semble très bien fonctionner! –

+1

Bonne réponse. Je préfère essayer catch au lieu de is (vide) pour éviter toute faute d'orthographe dans la chaîne timezone. try { nouveau DateTimeZone ($ timeZoneSource); } \t catch (Exception $ e) { $ timeZoneSource = date_default_timezone_get(); } –