2010-05-20 23 views
9

Tengo una columna de texto en mysql y almacena un valor de fecha en el formato aaaa-mm-dd. Ahora, en mi página php, uso este código para analizar en un valor de fecha.Usar strtotime para fechas anteriores a 1970

date("F j, Y", strtotime($row['value'])); 

Ahora, acabo de leer que strtotime() analiza los valores sólo después de 1 de enero de 1970. Tengo gran cantidad de valores de fecha antes de esa fecha. Hay un trabajo alrededor? No quiero cambiar la estructura de mi base de datos

Respuesta

1

debe usar una columna date, no el texto.
y date_format() función de SQL para el formato de fecha en la consulta

+0

No puedo cambiar el tipo de columna. Tengo varios valores en una columna de texto y algunos de ellos son fechas (en el formato aaaa-mm-dd). También hay otra columna que especifica si la fila contiene un valor de fecha o de texto. – Ctroy

+1

En ese caso, debe rediseñar su base de datos. – Jacco

+0

¿Está diciendo que no hay solución a este problema, sin rediseñar la base de datos? Solo quiero convertir un texto del formato aaaa-mm-dd al formato de fecha F j, Y. Por ejemplo: 1820-05-20 al 20 de mayo de 1820. – Ctroy

13

Desde el documentation for strtotime():

strtotime() tiene un límite de rango entre Vier 13 Dic 1901 20:45:54 GMT y el mar 19 Ene 2038 03:14:07 GMT; aunque antes de PHP 5.1.0 este rango estaba limitado del 01-01-1970 al 19-01-2038 en algunos sistemas operativos (Windows).

¿Qué versión de PHP estás ejecutando? ¿Y en qué plataforma? Tal vez es hora de una actualización.

Si está trabajando con fechas fuera del rango del 13 de diciembre de 1901 al 19 de enero de 2038, considere usar objetos DateTime de PHP que pueden funcionar con un rango de fechas mucho más amplio.

procedimiento:

$date = date_create($row['value']); 
if (!$date) { 
    $e = date_get_last_errors(); 
    foreach ($e['errors'] as $error) { 
     echo "$error\n"; 
    } 
    exit(1); 
} 

echo date_format($date, "F j, Y"); 

POO:

try { 
    $date = new DateTime($row['value']); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
    exit(1); 
} 

echo $date->format("F j, Y"); 
+0

Gracias - Estoy usando el motor de búsqueda Apache Solr, por lo que usar la función mysql date_format no es una opción ya que todas las fechas deben ser indexadas en YYYY-MM-DDTHH-MM -SSZ formato. Esto debe analizarse usando PHP (estoy usando la API de PHP para recuperar resultados de búsqueda), DateTime fue el ticket. editar: esta podría ser una respuesta para los demás que tengan este problema con Apache Solr: http://wiki.apache.org/solr/DataImportHandler#DateFormatTransformer –

+0

@Mark: Tengo php5.2.6, strtotime aún muestra una fecha en blanco antes de 1970. ¿Dónde viste "antes de 5.1.0 ..." cosa? –

+0

@ScottChu - Una marca de tiempo es un entero con signo; los valores negativos se usan por segundos antes de 1970-01-01 00:00:00 GMT, y han estado en todas las plataformas desde 5.1.0 ..... la referencia a esto está en la sección de Notas en [docs] (http : //www.php.net/manual/en/function.strtotime.php) página (nota 2) –

1
function safe_strtotime($string) 
{ 
    if(!preg_match("/\d{4}/", $string, $match)) return null; //year must be in YYYY form 
    $year = intval($match[0]);//converting the year to integer 
    if($year >= 1970) return date("Y-m-d", strtotime($string));//the year is after 1970 - no problems even for Windows 
    if(stristr(PHP_OS, "WIN") && !stristr(PHP_OS, "DARWIN")) //OS seems to be Windows, not Unix nor Mac 
    { 
     $diff = 1975 - $year;//calculating the difference between 1975 and the year 
     $new_year = $year + $diff;//year + diff = new_year will be for sure > 1970 
     $new_date = date("Y-m-d", strtotime(str_replace($year, $new_year, $string)));//replacing the year with the new_year, try strtotime, rendering the date 
     return str_replace($new_year, $year, $new_date);//returning the date with the correct year 
    } 
    return date("Y-m-d", strtotime($string));//do normal strtotime 
} 
+1

strtotime devuelve una marca de tiempo, su función devuelve una fecha ISO 8601. ¡Esta es una diferencia extremadamente importante! – Andrew

+0

de hecho tienes razón. Sin embargo, lo que @Ctroy está pidiendo es una forma de tener una fecha ISO 8601, ¡así que supongo que mi imprecisión podría perdonarse! – Gombo

0

soy un novato, y estaba teniendo algunos problemas similares en relación con el uso de strtotime vs explotar. Me encontré con este hilo y me ayudaron mucho los comentarios sobre el cambio en el límite de fechas de Mark Baker (¡gracias!). Así que escribí este código solo para jugar con el concepto. Tal vez ayudará a otros noobs como yo.

Simplemente cambie la fecha en la línea PHP superior y vea qué sucede con las fechas a continuación, muy interesante. ¡Gracias de nuevo!

<?php $dob = "1890-11-11"; ?> 
<html> 
<head> 
<style> 

.inputdiv { 
    width:200px; 
    margin:100px auto 10px auto; 
    background-color:#CCC2FC; 
    text-align:center; 
    border:1px solid transparent;} 

.spacer{ 
    width:199px; 
    margin:20px auto 20px auto;}  

</style> 
</head> 
<body> 

<div class="inputdiv"> 
    <div class="spacer"><?php echo "Raw dob: ".$dob ?></div> 
    <div class="spacer"><?php echo "Strtotime dob: ".date("m-d-Y", strtotime($dob)) ?></div> 
    <div class="spacer"><?php list ($y, $m, $d) = explode('-', $dob); 
         $dob = sprintf("%02d-%02d-%04d", $m, $d, $y); 
         echo "Explode dob: ".$dob ?></div> 
</div> 
</body> 
</html> 
1
$date = DateTime::createFromFormat('d M Y','17 Jan 1900'); 
echo $date->format('Y-m-d'); 
Cuestiones relacionadas