PHP-strtotime, spécifiez le fuseau horaire

j'ai une chaîne de date, dites'2008-09-11'. Je veux en retirer un timestamp, mais je dois spécifier un timezone dynamiquement (plutôt que PHP par défaut).

pour récapituler, j'ai deux cordes:

$dateStr = '2008-09-11';
$timezone = 'Americas/New_York';

Comment puis-je obtenir l'horodatage pour cela?

EDIT: Le temps de la journée sera le minuit de la journée.... $ dateStr = '2008-09-11 00:00:00';

43
demandé sur Andy Hin 2010-08-25 22:21:02

5 réponses

$date = new DateTime($dateStr, new DateTimeZone($timezone));

$timestamp = $date->format('U');

65
répondu salathe 2015-08-19 14:26:10

la réponse acceptée est super si vous utilisez PHP > 5.2 (je pense que c'est la version qu'ils ont ajouté la classe DateTime). Si vous voulez soutenir une ancienne version, vous ne voulez pas taper autant, ou simplement si vous préférez l'approche fonctionnelle il est une autre façon qui ne prend pas en modifier les paramètres globaux:

$dateStr = '2008-09-11 00:00:00';
$timezone = 'America/New_York';
$dtUtcDate = strtotime($dateStr. ' '. $timezone);
18
répondu krowe 2015-07-18 22:09:49

cela fonctionnera si pour une raison quelconque vous utilisez <5.2 (Dieu nous en préserve).

$reset = date_default_timezone_get();
date_default_timezone_set('America/New_York');
$stamp = strtotime($dateStr);
date_default_timezone_set($reset);

mais tout ce qui est 5.2 et plus haut, je vous recommande fortement d'opter pour la réponse de @salathe.

16
répondu Jonah 2015-07-29 23:00:45

si vous allez utiliser Timezones, je vous propose D'utiliser la classe DateTime, et dans ce cas la fonction DateTime::createFromFormat() qui vous permettra de faire semothing comme ceci:

$start = "2015-01-14 11:59:43";
$timezone = "America/Montreal";

$tz = new DateTimeZone($timezone);
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $start, $tz);

quand vous mettez $tz dans la fonction DateTime:: createFromFormat, vous lui dites dans quel fuseau horaire se trouve la date que vous avez donnée, de sorte que lorsque vous devez la convertir dans un autre fuseau horaire, tout ce que vous avez à faire est quelque chose comme ceci:

$start = $dt->setTimeZone(new DateTimeZone('UTC'));
3
répondu Philippe Gilbert 2015-01-14 19:41:17

chaque fois que vous faites référence à un moment précis dans le temps, persistez le temps selon une norme unifiée qui n'est pas affectée par l'heure d'été. (GMT et UTC sont équivalents à ce sujet, mais il est préférable d'utiliser le terme UTC. Notez que UTC est également connu sous le nom de Zulu ou Z time.)

si au lieu de cela vous choisissez de persister un temps en utilisant une valeur locale de temps, incluez le décalage de temps local de UTC, de sorte que l'horodatage peut être interprété plus tard sans ambiguïté.

dans certains cas, vous pouvez avoir besoin de stocker à la fois l'heure UTC et l'heure locale équivalent. Souvent, cela se fait avec deux champs séparés, mais certaines plateformes prennent en charge un type datetimeoffset qui peut stocker les deux dans un seul champ.

lorsque vous stockez des horodateurs comme valeur numérique, utilisez Unix time-qui est le nombre de secondes entières depuis 1970-01-01T00:00:00Z (à l'exclusion des secondes intercalaires). Si vous avez besoin de plus de précision, utilisez des millisecondes à la place. Cette valeur doit toujours être basée sur UTC, sans aucune ajustement du fuseau horaire.

si vous avez besoin plus tard de modifier l'horodatage, incluez L'ID du fuseau horaire original pour que vous puissiez déterminer si le décalage peut avoir changé par rapport à la valeur originale enregistrée.

lors de la planification d'événements futurs, l'heure locale est habituellement préférée à L'heure TUC, car il est courant que la décalage change. Voir la réponse, et blog.

rappelez-vous que les décalages de fuseau horaire ne sont pas toujours un nombre entier d'heures (par exemple, heure normale indienne est UTC+05: 30, et le Népal utilise UTC+05:45).

si vous utilisez Java, utilisez java.heure pour Java 8,ou utilisez Joda Time pour Java 7 ou moins. Si vous utilisez .NET, envisagez D'utiliser Noda Time. Si vous utilisez .NET sans aucun délai, considérez que DateTimeOffset est souvent un meilleur choix que DateTime. Si vous utilisez Perl, utilisez DateTime. Si vous utilisez Python, utilisez pytz ou dateutil. Si vous utilisez JavaScript, utilisez moment.js avec l'extension moment-fuseau horaire. Si vous utilisez PHP > 5.2, utilisez les conversions de fuseaux horaires fournies par DateTime, et les classes DateTimeZone. Être prudent lors de l'utilisation.

DateTimeZone:: listabbrevisations() - voir réponse. Pour garder PHP avec des données Olson à jour, installez périodiquement le paquet PECL de timezonedb; voir réponse.

si vous utilisez C++, assurez-vous d'utiliser une bibliothèque qui utilise correctement la base de données IANA timezone. Il s'agit de cctz, ICU, et la bibliothèque "tz" de Howard Hinnant.

N'utilisez pas Boost pour les conversions de fuseaux horaires. Tandis que son API prétend soutenir la norme IANA (alias "zoneinfo"), il les mappe de façon rudimentaire à des décalages fixes sans tenir compte de la riche histoire des changements que chaque zone a pu avoir.

(de plus, le fichier a été retiré de la maintenance.)

la plupart des règles d'affaires utilisent le temps civil, plutôt que L'UTC ou le GMT. Par conséquent, projetez de convertir UTC horodatage à un fuseau horaire local avant d'appliquer la logique d'application.

Rappelez-vous que les fuseaux horaires et les décalages ne sont pas fixes et peuvent changer. Pour par exemple, historiquement, les États-Unis et le Royaume-Uni ont utilisé les mêmes dates pour "spring forward" et "fall back".

Cependant, en 2007, les États-Unis ont changé les dates auxquelles les horloges sont changées. Cela signifie que pour 48 semaines de l'année la différence entre le temps de Londres et le temps de New York est de 5 heures et pour 4 semaines (3 au printemps, 1 à l'automne) il est de 4 heures. Soyez conscient des éléments comme celui-ci dans tous les calculs qui impliquent plusieurs zones.

tenir compte du type de temps (temps réel de l'événement, Heure de diffusion, heure relative, heure historique, heure récurrente) quels éléments (horodatage, décalage du fuseau horaire et nom du fuseau horaire) vous devez stocker pour une récupération correcte - voir "Types de temps" dans la réponse.

gardez vos fichiers OS, base de données et application tzdata synchronisés, entre eux et le reste du monde.

sur les serveurs, réglez les horloges matérielles et OS sur UTC plutôt que sur un fuseau horaire local.

indépendamment du point précédent, côté serveur le code, y compris les sites web, ne devrait jamais s'attendre à ce que le fuseau horaire local du serveur soit quelque chose en particulier. voir la réponse.

utilisez les services NTP sur tous les serveurs.

si vous utilisez FAT32, rappelez-vous que les horodateurs sont stockés en heure locale, et non en UTC.

lorsque vous faites face à des événements récurrents (émission de télévision hebdomadaire, par exemple), rappelez-vous que l'heure change avec la DST et sera différente d'un fuseau horaire à l'autre.

toujours interroger les valeurs date-heure sous forme de limite inférieure inclusive, limite supérieure exclusive ( > = ,<).

2
répondu Charu 2016-06-28 05:54:43