web-dev-qa-db-fra.com

Comment convertir entre les fuseaux horaires en PHP en utilisant la classe DateTime?

J'essaie de convertir l'heure entre l'heure actuelle en UTC et UTC en fuseau horaire actuel.

Voici ce que j'ai fait:

$schedule_date = new DateTime($triggerOn, new DateTimeZone('UTC') );
$triggerOn =  $schedule_date->format('Y-m-d H:i:s');

echo $triggerOn;

La valeur de sortie ne change pas la seule chose qui change de format.

la chaîne $triggerOn a été généré sur la base de America/Los_Angeles fuseau horaire

Voici à quoi ressemble ma chaîne avant et après:

BEFORE    04/01/2013 03:08 PM
AFTER     2013-04-01 15:08:00

Donc, le problème ici est que DateTime ne se convertit pas en UTC.

45
Jaylen

Ce que vous recherchez est le suivant:

$triggerOn = '04/01/2013 03:08 PM';
$user_tz = 'America/Los_Angeles';

echo $triggerOn; // echoes 04/01/2013 03:08 PM

$schedule_date = new DateTime($triggerOn, new DateTimeZone($user_tz) );
$schedule_date->setTimeZone(new DateTimeZone('UTC'));
$triggerOn =  $schedule_date->format('Y-m-d H:i:s');

echo $triggerOn; // echoes 2013-04-01 22:08:00
89
Mike

Vous consommez la date/heure et définissez le fuseau horaire correctement, mais avant de formater la date/heure, vous ne définissez pas le fuseau horaire de sortie souhaité. Voici un exemple qui accepte un fuseau horaire UTC et convertit la date/l'heure en fuseau horaire America/Los_Angeles:

<?php
$original_datetime = '04/01/2013 03:08 PM';
$original_timezone = new DateTimeZone('UTC');

// Instantiate the DateTime object, setting it's date, time and time zone.
$datetime = new DateTime($original_datetime, $original_timezone);

// Set the DateTime object's time zone to convert the time appropriately.
$target_timezone = new DateTimeZone('America/Los_Angeles');
$datetime->setTimeZone($target_timezone);

// Outputs a date/time string based on the time zone you've set on the object.
$triggerOn = $datetime->format('Y-m-d H:i:s');

// Print the date/time string.
print $triggerOn; // 2013-04-01 08:08:00
14
Joshua Burns

Créez la date à l'aide du fuseau horaire local, puis appelez DateTime::setTimeZone() pour la modifier.

3
Jerry