2010-07-05 15 views
4

J'ai un service web en PHP qui récupère l'objet dateTime (depuis asp). Je veux analyser cette date dans mon format personnalisé. La date est à l'origine au format "2010-07-05T00: 00: 00 + 02: 00". Quand j'essaie ceci:Problème de date PHP

$oDate = strtotime($date_from_webservice); 
$sDate = date("d.m.Y",$oDate); 
echo $sDate; 

Je reçois la date "07.04.2010" qui est un jour plus tôt. Pourquoi?

Merci

Répondre

8

regardant, la date d'origine (date_from_webservice de $) est dans le fuseau horaire GMT + 2, et le temps est minuit.

Je suppose que le fuseau horaire pour lequel PHP est configuré est différent (problème UTC), donc la date "apparaît" comme étant la veille. Cependant, la conversion est parfaitement correcte.

Pour résoudre cela, vous avez deux options:

  1. Demandez/indiquer au serveur d'origine pour retourner le datetime UTC (qui est ce qu'il devrait faire vraiment), assurez-vous que PHP utilise UTC ainsi que.

  2. Configurer PHP dans le même fuseau horaire que le serveur source, en utilisant date_default_timezone_set ou dans le php.ini. Notez que vous ne pouvez pas simplement ajouter/soustraire des heures, en raison de l'heure d'été.

  3. Si vous êtes sûr que le format datetime est cohérent, utilisez substr. Par exemple:

    $ sDate = sub ($ oDate, 8, 2). '.'. Substr ($ oDate, 5, 2). '.'. Substr ($ oDate, 0, 4);

L'option 1 est la meilleure. L'option 2 est risquée si le serveur d'origine a changé de fuseau horaire. L'option 3 suppose que le format datetime ne changera jamais.

+0

Pourquoi le serveur d'origine doit-il renvoyer le datetime en UTC? Vous pensez que le fuseau horaire est généralement hors de propos? – Artefacto

+0

Si vous diffusez des datetime en tant que service Web, il est préférable de les utiliser en tant que UTC pour des raisons assez évidentes, dans l'exemple le serveur d'origine doit sortir «2010-07-04T22: 00: 00 + 00: 00». Je n'ai jamais dit que le fuseau horaire était hors de propos ... – Pete

3

Parce que votre décalage horaire est inférieure à +2 heures. Disons que vous êtes à Lisbonne, où le décalage horaire actuel est UTC + 1 heure. Ensuite, cette heure sera "2010-07-04T23: 00: 00 + 01: 00", soit un jour avant.

Vous pouvez utiliser DateTime à la place:

$date = new DateTime("2010-07-05T00:00:00+02:00"); 
echo $date->format("d.m.Y"); //echoes 05.07.2010 

Cette associe automatiquement le fuseau horaire "+02: 00" à la date, assurant que la mise en forme est correcte.

D'autre part:

$date = new DateTime("2010-07-05T00:00:00+02:00"); 
$date->setTimeZone(new DateTimezone("Europe/Lisbon")); 
echo $date->format("d.m.Y"); //echoes 04.07.2010 
+0

Toute idée comment résoudre ce problème? – user345602

1

PHP utilise un fuseau horaire global (maléfique) lors du formatage des chaînes date. Vous pouvez utiliser fuseau horaire de $oDate en appelant date_default_timezone_set:

$oDate = strtotime($date_from_webservice); 

$oldTimezone = date_default_timezone_get(); 
date_default_timezone_set(date('e', $oDate)); 

$sDate = date('d.m.Y', $oDate); 

date_default_timezone_set($oldTimezone); 

echo $sDate;