2016-04-01 11 views
1

Ich importiere Daten aus einer CSV-Datei und eine Spalte hat eine Liste von Daten. Einige dieser Daten sind vor 1970. Ein Beispiel Datum wäre 10/03/1956php Format Datum vor 1970 von MySQL einfügen

Ich habe ein Problem bei der Formatierung dieser Daten in ein Format, das ich in MySQL einfügen kann.

, wenn ich diese verwenden

$date = DateTime::createFromFormat('d/m/Y', $col[8]); 

Ich erhalte diese Fehlermeldung

Aufruf einer Member-Funktion Format() auf einem Nicht-Objekt

aber wenn ich hart Code ein Datum wie dieses funktioniert es

$date = DateTime::createFromFormat('d/m/Y', '21/03/1966'); 

hier ist der vollständige Code

$inputFileName = 'data.csv'; 

if (($handle = fopen($inputFileName, "r")) !== FALSE) { 

    fgetcsv($handle); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 

     $num = count($data); 

     for ($i = 0; $i < $num; $i++) { 
      $col[$i] = $data[$i]; 
     } 

     try { 
      $date = DateTime::createFromFormat('d/m/Y', trim($col[8])); 
     } 
     catch (Exception $e) { 
      echo $e->getMessage(); 
      exit(1); 
     } 

     echo $date->format("Y-m-d"); 
    } 
    fclose($handle); 
} 
+2

Ihre CSV überprüfen und sicherstellen, dass alle Inhalte '$ col [8]' sind gültige Daten (die ich glaube, muss nach 1901 sein). – apokryfos

+0

Mögliches Duplikat von [Verwendung von strtotime für Daten vor 1970] (http://stackoverflow.com/questions/2871264/using-strtotime-for-dates-before-1970) –

+0

Sind Sie sicher, dass die Zeichenfolge im richtigen Datumsformat ist? Wenn Sie zum Beispiel $ col [8] ausgeben und mit $ col [7] vergleichen. Sind sie in Anbetracht der Formatierung gleich? –

Antwort

1

Sie haben keine Garantie, dass alle Felder in der CSV-Datei vorhanden sein wird, so dass Sie ein wenig Kontrolle tun müssen

define('DATE_COLUMN', 8); 
// @Warning : avoid hard coding file name ! 
$inputFileName = 'data.csv'; 

if (($handle = fopen($inputFileName, "r")) !== FALSE) { 

    fgetcsv($handle); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 

     $num = count($data); 

     for ($i = 0; $i < $num; $i++) { 
      $col[$i] = $data[$i]; 
     } 
     $dateString = NULL; 
     if (isset($col[DATE_COLUMN]) && 
      strlen(trim($col[DATE_COLUMN])) > 0) { 

      $dateString = trim($col[DATE_COLUMN]); 
     } 

     if (is_null($dateString)) { 
      // print log or throw an exception if you want 
     } 
     else { 
      try { 
       $date = DateTime::createFromFormat('d/m/Y', dateString); 
       echo $date->format("Y-m-d"); 
      } 
      catch (Exception $e) { 
       echo $e->getMessage(); 
       exit(1); 
      } 
     } 

    } 
    fclose($handle); 
}