2015-04-01 1 views
0

J'ai une erreur très étrange que je ne comprends pas. Pour une raison quelconque, certaines dates ne sont pas correctement analysées.Erreur de date d'analyse

Le code:

$day = strtotime($_GET['d']."-".$_GET['m']."-".$_GET['y']); 
$dateTimeZone = new DateTimeZone("Europe/Prague"); 
$dateTime = new DateTime($day, $dateTimeZone); 
$offset = ($dateTimeZone->getOffset($dateTime))/3600; 

Maintenant, la chose est vraiment bizarre .... si je passe dans certains numéros, cela fonctionne, mais il ne marche pas avec les autres ...

Par exemple, un URL comme ceci fonctionnerait:

d=15&m=12&y=2014 

Mais ceci:

d=12&m=12&y=2014 

montre

Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (1418252400) at position 7 (4): Unexpected character' in

J'ai essayé d'expérimenter avec elle, changeant aussi le format du strtotime, mais pas de chance et il semble juste complètement travailler ....

+0

Pourquoi envoyez-vous la date dans les paramètres séparés? –

+0

Vous n'avez pas besoin d'utiliser strtotime, vous pouvez passer la chaîne de date directement dans l'objet 'DateTime'. L'erreur est probablement due à un ordre incorrect du jour, du mois et de l'année. Il devrait être AAAA-MM-JJ. –

+0

Que montre 'var_dump ($ day)' quand cela arrive? – Barmar

Répondre

3

Lorsque vous envoyez horodatage en tant que paramètre d'objet DateTime, vous devez utiliser le symbole @ comme préfixe. Voir ce manuel (timestamp UNIX): http://php.net/manual/en/datetime.formats.compound.php

Ainsi, la manière correcte est:

$dateTime = new DateTime('@' . $day, $dateTimeZone); 

Ou, ce que je préfère:

$dateTime = DateTime($_GET['y']."-".$_GET['m']."-".$_GET['d']); 
1

au hasard vous l'envoyez un Paramètre invalide.

public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]])

Ce constructeur attend un A date/time string, pas un timestamp UNIX que vous envoyez. D'où l'exception. Supprimez l'appel strtotime autour de la date que vous mettez ensemble.

Maintenant, vous ou quelqu'un d'autre pourrait demander pourquoi cela fonctionne pour votre autre date alors? Non ça ne marche pas même alors. Essayez votre date de travail et voir quelle date DateTime que vous obtenez

echo $dateTime->format("Y-m-d");  

1600-04-01

Fiddle

Il n'a pas (et ne doit pas travailler) pour l'un de vos dates en raison de l'appel strtotime .

Manual