2009-12-18 6 views
4

Je sais comment utiliser les chaînes de format de date, pour transformer date('Y/m/d H:i:s'); en 2009/12/18 11:37:45.Fonction PHP pour obtenir le format de la date?

Je voudrais une fonction qui peut faire le contraire - regarder une date formatée puis retourner le format. Y a-t-il un en PHP?

La raison en est que nous avons des horodatages enregistrés dans notre base de données dans une variété de formats et j'écris un outil traitant toutes nos anciennes tables et analysant les entrées de date.

EDIT: donc je suppose qu'il n'y a pas une façon simple de le faire. Je pensais que je pourrais utiliser strftime(), qui renvoie le temps en secondes depuis l'époque. Donc, une meilleure question est de savoir si je peux utiliser ce temps en secondes dans les champs d'horodatage de la base de données mySQL? Je suppose que cela fonctionnerait si la table est structurée comme un horodatage et non un varchar, ce qui est parfois le cas.

+2

Vous pourriez rencontrer des problèmes de localisation avec des dates comme 2009/10/07. Est-ce Y/m/d ou Y/d/m? –

Répondre

2

Non, il n'y a pas une telle fonction. Vous devrez écrire un ensemble de correspondances d'expressions régulières qui expriment toutes les variations possibles, par ex.

$variations = array (
    '^([0-9]{4})/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{4}2$' => 'Y/m/d H:i:s', 
    // more here 
); 

foreach ($dateFromDatabase as $date) { 
    foreach ($variations as $regexp => $dateFormat) { 
     if (preg_match ('|' . $regexp . '|', $date)) { 
      $matches[$dateFromDatabase] = $dateFormat; 
      break; 
     } 
    } 
} 

// $matches now consists of an array of dates => format 
+0

C'est mieux que ma réponse, parce que vous mettez toutes les définitions dans un tableau au lieu d'un tas de code. – gahooa

0

Vous pouvez utiliser regexp pour identifier des formats de date spécifiques. Vous pouvez ajouter à votre liste d'expressions rationnelles jusqu'à ce que vous ayez une couverture de 100%.

if(preg_match('/^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}$/', $Date)) 
    $Format = 'Y/m/d H:i:s'; 

etc ...

0

Vous ne avez pas besoin d'obtenir la date en m/d/format Y. Vous pouvez utiliser strtotime pour transformer n'importe quelle date valide en un autre format de date que vous voulez.

date('format', strtotime($date)); 
1

Oui, il n'existe une fonction pour cela: strtotime()

strtotime - Parse à propos de toute description datetime textuelle anglais dans un timestamp Unix

EDIT: D'accord, la fonction pourrait pas retourner le formatage utilisé, mais vous obtiendrez l'horodatage, puis vous êtes en mesure de le stocker dans n'importe quel format.

0

Il est peut-être préférable de les enregistrer tous en tant qu'horodatages unix. Vous pouvez ensuite les formater à la volée très facilement en fonction de ce que vos utilisateurs veulent voir.