web-dev-qa-db-fra.com

Comment obtenir un timestamp Unix en php basé sur le fuseau horaire

Code premier 

    echo time() . '<br/>';
echo date('Y-m-d H:i:s') . '<br/>';
date_default_timezone_set('America/New_York'); 

echo time() . '<br/>';
print_r($timezones[$timezone] . '<br/>');
echo date('Y-m-d H:i:s') . '<br/>';

Dans le code ci-dessus, la date est imprimée en fonction du fuseau horaire, mais l'horodatage unix est identique, même après avoir défini le fuseau horaire par défaut. 

Comment pouvons-nous imprimer l'horodatage Unix en fonction du fuseau horaire?

15
jimy

La réponse fournie par Volkerk est correcte, mais si vous avez vraiment besoin d'une solution de contournement, regardez mon exemple.

<?php

//default timezone
$date = new DateTime(null);
echo 'Default timezone: '.$date->getTimestamp().'<br />'."\r\n";

//America/New_York
$date = new DateTime(null, new DateTimeZone('America/New_York'));
echo 'America/New_York: '.$date->getTimestamp().'<br />'."\r\n";

//Europe/Amsterdam
$date = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));
echo 'Europe/Amsterdam: '.$date->getTimestamp().'<br />'."\r\n";

echo 'WORK AROUND<br />'."\r\n";
// WORK AROUND
//default timezone
$date = new DateTime(null);
echo 'Default timezone: '.($date->getTimestamp() + $date->getOffset()).'<br />'."\r\n";

//America/New_York
$date = new DateTime(null, new DateTimeZone('America/New_York'));
echo 'America/New_York: '.($date->getTimestamp() + $date->getOffset()).'<br />'."\r\n";

//Europe/Amsterdam
$date = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));
echo 'Europe/Amsterdam: '.($date->getTimestamp() + $date->getOffset()).'<br />'."\r\n";
?>

Obtenir l'horodatage normal et ajouter le décalage UTC

30
Cecil Zorg

https://en.wikipedia.org/wiki/Unix_time

Le temps Unix, ou temps POSIX, est un système permettant de décrire les instants dans le temps, défini comme le nombre de secondes écoulées. à partir de minuit, temps universel coordonné (UTC) du jeudi 1er janvier 1970

L'horodatage Unix n'est pas affecté par un paramètre de fuseau horaire. Le réglage du fuseau horaire affecte uniquement l'interprétation de la valeur d'horodatage.

20
VolkerK

J'ai eu le même problème moi-même, et c'est l'approche la plus facile que je pourrais faire assez rapidement.

$dateTimeZone = new DateTimeZone("America/New_York");
$dateTime = new DateTime("now", $dateTimeZone);
$timeOffset = $dateTimeZone->getOffset($dateTime);

// New time since Epoch according to timezone
$newTime = time() + $timeOffset;

echo date("H:i:s", $newTime);
1
dalslandan200

Regardez les réponses avec la solution offset et je pense que si vous ne gagnez pas de temps dans la base de données au format UTC ou Unix, ils ne vous aideront pas. Le problème, quand il s'agit de getTimestamp (), est que le fuseau horaire n'est pas pris en compte même lorsque vous lancez l'objet ... Comment puis-je l'expliquer:) ... ... disons que vous avez un événement avec date et heure . Vous avez également votre fuseau horaire correctement configuré. Je vais les mettre en vars pour cet exemple, donc c'est plus visible:

$dateTime = '25.08.2018 16:45:15';//some event in your db //can be any valid format
$localTimezone = 'Europe/Berlin';
$dateTimeLocal = new \DateTime($dateTime, new \DateTimeZone($localTimezone));
var_dump($dateTimeLocal->getTimestamp());`

Maintenant ... lorsque vous faites cela, vous transmettez la date et l'heure au constructeur. Ce que vous pouvez vous attendre, c’est que php respecte votre fuseau horaire et vous obtenez un horodatage UTC correspondant à 16h45 à Berlin, soit 15h45 en hiver et 14h45 en été. Cela n'arrivera pas - vous obtenez un horodatage correspondant à 16:45 UTC. Si vous ajoutez le décalage maintenant, vous aurez une heure ou deux.

Pour ce faire, vous devez initialiser l'objet, définir/changer les fuseaux horaires, créer une date/heure formatée qui respecte le fuseau horaire, puis obtenir un horodatage à partir de la date/heure formatée. Cela peut être un peu plus lent, mais son fuseau horaire échoue, preuve:

$date = '25.08.2018 16:45:15';//some event in your db //can be any valid format
$format = 'Y-m-d H:i:s';//just a format we will use for this example //also can be any valid format
$localTimezone = 'Europe/Berlin';
$remoteTimezone = 'America/Lima';
$dateTime = new \DateTime($date, new \DateTimeZone($localTimezone));
$dateTime->setTimezone(new \DateTimeZone($remoteTimezone));
$timestampLima = DateTime::createFromFormat($format, $dateTime->format($format))->getTimestamp();
0
Iliya Kolev