2 votes

PHP obtient un horodatage unix à partir d'une chaîne de caractères sans définir le fuseau horaire par défaut

J'ai une date précise de 1/1/2020 00:00:00 America/Los_Angeles que je veux convertir en un timestamp UNIX. De nombreuses réponses veulent définir un fuseau horaire par défaut à l'aide de la fonction date_default_timezone_set avant d'insérer la chaîne dans strtotime() fonction. Mais je ne veux pas perturber le fuseau horaire par défaut du serveur (qui est probablement UTC).

Y a-t-il quelque chose de mal à faire strtotime("1/1/2020 00:00:00 America/Los_Angeles") pour obtenir mon horodatage ?

J'obtiens la valeur UNIX correcte de cette façon. C'est juste qu'il n'y a rien dans la documentation qui indique que c'est valide.

2voto

Kris Roofe Points 13087

Comme votre strate horaire possède un fuseau horaire, il n'est pas nécessaire de définir le fuseau horaire par défaut. Mais lorsque vous voulez l'imprimer, vous devez définir le fuseau horaire par défaut.

php > echo date_default_timezone_get();
UTC

php > echo date("Y-m-d H:i:s",strtotime("1/1/2020 00:00:00 America/Los_Angeles"));
2020-01-01 08:00:00

php > echo date("Y-m-d H:i:s",strtotime("1/1/2020 00:00:00"));
2020-01-01 00:00:00

1voto

jspit Points 707

Strtotime et datetime traitent également les informations de fuseau horaire situées dans la chaîne de date. Si elles sont omises, les paramètres locaux du serveur sont utilisés.

Cela fournit un horodatage correct

strtotime("1/1/2020 00:00:00 America/Los_Angeles");

Mais la sortie avec date() utilise le fuseau horaire local du serveur.

Ces problèmes n'existent pas lorsque la classe DateTime est utilisée. Dans l'objet DateTime, le fuseau horaire est stocké dans l'objet, indépendamment des paramètres locaux du serveur.

echo date_default_timezone_get(); //my Server get Europe/Berlin

$dateTimeLA = date_create("1/1/2020 00:00:00", new DateTimeZone('America/Los_Angeles'));

echo $dateTimeLA->format("Y-m-d H:i:s e");

Sortie : 2020-01-01 00:00:00 Amérique/Los_Angeles

Si l'horodatage est nécessaire :

$tsLA = $dateTimeLA->getTimeStamp();
echo $tsLA;  //1577865600

Comment créer un DateTime-Object à partir d'un timestamp :

$dateFromTs = date_create(null, new DateTimeZone('America/Los_Angeles'));
$dateFromTs->setTimestamp(1577865600);
var_dump($dateFromTs);

Sortie :

object(DateTime)#4 (3) {
  ["date"]=>
  string(19) "2020-01-01 00:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(19) "America/Los_Angeles"
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X