2010-02-25 8 views
2

Voici ce que j'ai:format de date PHP conversion

$dateFormat = 'M d, Y'; 
$dateString = 'January 23, 2010'; 

Ce que je besoin est un horodatage de $dateString je peux le faire:

$newFormattedDate = date('Y-m-d', $timestamp); 

J'ai essayé d'utiliser strtotime fonction, mais il tente pour trouver le format lui-même et ne fonctionne pas toujours. Dans ma situation, je connais à la fois la chaîne de date et le format de date.

Comment puis-je définir $timestamp à une valeur appropriée pour une utilisation avec la fonction date?

EDIT: J'ai besoin que cela fonctionne dans les environnements Linux et Windows.

EDIT: La solution doit prendre en charge la version de PHP 4 ou plus

EDIT: MySQL a une fonction appelée STR_TO_DATE qui prend une chaîne de date et un format de date et retourne Y-m-d date formatée. Toute fonction équivalente pour php fonctionne pour moi aussi.

Répondre

3

Utilisez strptime, mktime et strftime:

$ftime = strptime($dateString, $dateFormat); 
$timestamp = mktime($ftime['tm_hour'], $ftime['tm_min'], $ftime['tm_sec'], 1, 
        $ftime['tm_yday'] + 1, $ftime['tm_year'] + 1900); 

echo strftime('Y-m-d', $timestamp); 

S'il vous plaît noter que strptime n'est pas implémentée sur les plates-formes Windows.

Notez que les arguments à mktime sont quelque peu inhabituelle - strptime retourne un jour de l'année (entre 0-365, y compris) au lieu d'un jour du mois et un mois, nous avons donc mis le paramètre de mois à mktime à 1 et ajoutez 1 au jour de l'année. En outre, strptime renvoie des années depuis 1900 pour la valeur de l'année, il retourne, donc nous devons ajouter 1900 à l'année avant de le transmettre à mktime.

En outre, vous pouvez vérifier si $ftime est FALSE avant de le passer dans mktime. strptime retournant FALSE indique que les entrées $dateString n'est pas un format de date valide selon $dateFormat.

+0

Merci Dominic mais en php manaul de strptime il dit: « Cette fonction est pas implémentée sur les plates-formes Windows. ». C'est un tueur pour moi. – matte

+0

Il y a aussi 'strtotime' qui aide. – casraf

+0

Salut Henasraf, comme je l'ai expliqué dans ma question, strtotime ne fonctionne pas dans cette situation. – matte

7

Au PHP5.3 vous pouvez utiliser l'API DateTime

$dt = date_create_from_format('M d, Y', 'January 23, 2010'); 
echo date_timestamp_get($dt); 

ou avec la notation POO

$dt = DateTime::createFromFormat('M d, Y', 'January 23, 2010'); 
echo $dt->getTimestamp(); 

Note que si DateTime est disponible en PHP < 5.3, les méthodes utilisées ci-dessus ne sont pas et tandis que vous pourriez simuler ->getTimestamp() avec ->format('U'), il n'y a pas de solution de contournement facile pour createFromFormat()

Une alternative serait d'utiliser Zend_Date de Zend Framework:

$date = new Zend_Date('Feb 31, 2007', 'MM.dd.yyyy'); 
echo $date->get(Zend_Date::TIMESTAMP); 
+0

Salut Gordon, merci pour la réponse, mais j'ai besoin de cela pour travailler en PHP 4 ou supérieur. J'ai ajouté cette exigence à la question également. – matte

2

Compte tenu de ma compréhension de la question et ce qui est disponible en PHP, vous avez besoin pour se détendre vos attentes quelque part.Une solution «simple» (qui a déjà été réduite) serait de forcer l'utilisation de PHP 5.3 et des outils qui y sont disponibles.

Une solution moins simple serait de prendre ces ajouts et de les porter sur PHP-land (avec la compatibilité PHP 4, bonne chance). Un autre chemin de l'exploration serait de considérer les occasions où strtotime ne fonctionne pas pour vous et contourner ces limitations.

Quelle est la variante de vos chaînes de format? Il peut être possible de trouver des chaînes de format de mappage de solution vers des fonctions/méthodes (pour effectuer cette analyse de date) à condition qu'elles soient assez restreintes.

0
$dateFormat = 'M d, Y' 
$timestamp = strtotime($dateString); 
echo date($dateFormat, $timestamp); 

si je ne l'ai pas mal comprendre votre question, vous pouvez essayer le code ci-dessus ..