2011-05-26 29 views
67

Tengo un formulario que pasa dos fechas (inicio y finalización) a un script PHP que las agregará a un DB. Tengo problemas para validar esto. Quiero evitar los siguientes erroresUn valor numérico no bien formado encontrado

Un valor numérico no bien formado encontró

Esto es cuando utilizo el siguiente

date("d",$_GET['start_date']); 

Pero cuando se utiliza el strtotime () función tal como se aconseja en muchos sitios, recibo una fecha de sello de fecha único de 1/1/1970. ¿Alguna idea de cómo puedo obtener la fecha correcta?

+4

Es necesario para publicar lo que '$ _GET [ 'fecha_inicial']' contiene. – JohnP

+1

Supongo que su '$ _GET ['start_date']' no es una [timestamp] (http: //en.wikipedia.org/wiki/Timestamp) que se espera mediante la función 'date' como segundo argumento – Nemoden

+0

La segunda respuesta de DChaplin es más apropiada en este caso – cw24

Respuesta

150

Podría ser porque está pasando cadena como un segundo argumento a la función de fecha. Trate strtotime:

date("d",strtotime($_GET['start_date'])); 
6

$_GET['start_date'] no es numérico es mi apuesta, pero un formato de fecha no compatible con strtotime. Deberá volver a formatear la fecha en un formato viable para strtotime o utilizar la combinación de explode/mktime.

Podría agregar un ejemplo si tiene la amabilidad de publicar el formato que recibe actualmente.

+0

La conversión no solucionará el problema ya que PHP la lanzará automáticamente cuando se pase al método. – JohnP

+0

Por favor revisa mi actualización. –

5

me encontré con esta misma situación (en mi caso con un valor de fecha en un campo PHP personalizado en una vista Drupal), y lo que funcionó para mí fue el uso intval en lugar de strtotime para convertir el valor en un entero, porque básicamente era una marca de tiempo, pero en forma de una cadena en lugar de un número entero. Obviamente, ese no será el caso para todos, pero podría valer la pena intentarlo.

0

Esta es una vieja pregunta, pero hay otra manera sutil de que este mensaje pueda suceder. Se explica bastante bien here, in the docs.

Imagínese esto scenerio:

try { 
    // code that triggers a pdo exception 
} catch (Exception $e) { 
    throw new MyCustomExceptionHandler($e); 
} 

Y MyCustomExceptionHandler se define más o menos así:

class MyCustomExceptionHandler extends Exception { 
    public function __construct($e) { 
    parent::__construct($e->getMessage(), $e->getCode()); 
    } 
} 

esto va a desencadenar una nueva excepción en el manejador de excepción personalizada porque la clase Exception está esperando un número de el segundo parámetro en su constructor, pero PDOException podría haber cambiado dinámicamente el tipo de devolución de $e->getCode() a una cadena.

Una solución para esto sería definir gestor de excepciones que a medida como:

class MyCustomExceptionHandler extends Exception { 
    public function __construct($e) { 
    parent::__construct($e->getMessage()); 
    $this->code = $e->getCode(); 
    } 
} 
4

Simplemente se puede resolver este problema utilizando strtotime() función.

date("d",strtotime($_GET['start_date'])); 
0

Esto me ha ayudado mucho -

$new_date = date_format(date_create($old_date), 'Y-m-d'); 
Cuestiones relacionadas