web-dev-qa-db-fra.com

Chaîne de date / heure UTC au fuseau horaire

Comment convertir une chaîne de date/heure (par exemple, 2011-01-01 15:00:00) au format UTC en un fuseau horaire donné, tel que America/New_York ou Europe/San_Marino.

56
amax

L'objet DateTime de PHP est assez flexible.

$UTC = new DateTimeZone("UTC");
$newTZ = new DateTimeZone("America/New_York");
$date = new DateTime( "2011-01-01 15:00:00", $UTC );
$date->setTimezone( $newTZ );
echo $date->format('Y-m-d H:i:s');
133
Kevin Peno

L'objet DateTime de PHP est assez flexible.

Puisque l'utilisateur a demandé plus d'une option de fuseau horaire, vous pouvez le rendre générique.

Fonction générique

function convertDateFromTimezone($date,$timezone,$timezone_to,$format){
 $date = new DateTime($date,new DateTimeZone($timezone));
 $date->setTimezone( new DateTimeZone($timezone_to) );
 return $date->format($format);
}

Utilisation:

echo  convertDateFromTimezone('2011-04-21 13:14','UTC','America/New_York','Y-m-d H:i:s');

Sortie:

2011-04-21 09:14:00

2
Miguel
function _settimezone($time,$defaultzone,$newzone)
{
$date = new DateTime($time, new DateTimeZone($defaultzone));
$date->setTimezone(new DateTimeZone($newzone));
$result=$date->format('Y-m-d H:i:s');
return $result;
}

$defaultzone="UTC";
$newzone="America/New_York";
$time="2011-01-01 15:00:00";
$newtime=_settimezone($time,$defaultzone,$newzone);
1
Gaurav Sharma

En supposant que l'UTC ne soit pas inclus dans la chaîne, alors:

date_default_timezone_set('America/New_York');
$datestring = '2011-01-01 15:00:00';  //Pulled in from somewhere
$date = date('Y-m-d H:i:s T',strtotime($datestring . ' UTC'));
echo $date;  //Should get '2011-01-01 10:00:00 EST' or something like that

Ou vous pouvez utiliser l'objet DateTime.

1
Phoenix

Fonction de normalisation à usage général pour formater un horodatage d'un fuseau horaire à un autre. Très utile pour stocker les horodatages des utilisateurs de différents fuseaux horaires dans une base de données relationnelle. Pour les comparaisons de base de données, stockez l’horodatage au format UTC et utilisez-le avec gmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

Utilisation:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
0
Sandeep