2010-03-21 6 views
0

Supposons que vous ayez un système de messagerie construit en PHP avec un backend de base de données MySQL, et que vous souhaitiez prendre en charge la recherche de messages à l'aide de chaînes de dates arbitraires.Recherche de base de données par date arbitraire dans PHP

La base de données comprend une table de messages, avec un champ 'date_created' représenté en tant que datetime.

Les exemples de chaînes de date arbitraires qui seraient acceptées par l'utilisateur doivent refléter ceux acceptés par strtotime.

Pour les exemples suivants, les recherches effectuées le 21 Mars 2010:

"26 Janvier, 2009" retournera tous les messages entre 2009-01-26 00:00:00 et 2009-01-27 00: 00:00
"8 mars" retournerait tous les messages entre 2010-03-08 00:00:00 et 2010-01-26 00:00:00
"La semaine dernière" retournerait tous les messages entre 2010-03- 14 00:00:00 et 2010-03-21 018: 25: 00
"2008" renverrait tous les messages entre 2008-01-01 00:00:00 et 2008-12-31 00:00:00

J'ai commencé à travailler avec dat e_parse, mais le nombre de variables a augmenté rapidement. Je me demande si je ré-invente la roue.

Quelqu'un a-t-il une suggestion qui fonctionnerait comme une solution générale ou qui pourrait capturer la plupart des chaînes d'entrée possibles?

Répondre

2

Essayez strtotime Il est très bon pour deviner correctement les dates.

  • "La semaine dernière,"
  • "la semaine prochaine"
  • "+ 15 jours"
  • "Mardi dernier"
  • "31st Octobre"
  • etc.
+2

de strtotime est bon pour interpréter la chaîne initiale donnée par l'utilisateur, mais la complexité vient en utilisant le temps retourné pour obtenir l'heure de début et de fin de la gamme. Par exemple, si un utilisateur entre «2009», la date de début devrait être le premier jour de 2009 à l'aube et le dernier jour de 2009 à minuit. Mais si l'utilisateur entre «18 mars 2009», la date de début devrait être le 18 mars 2009 à l'aube et la date de fin devrait être le 18 mars 2009 à minuit. Peu importe ce que l'utilisateur entre, strtotime ne me donnerait qu'un timestamp unix. – jverdi

+0

Hmm, votre meilleur pari est de retour à l'écriture de votre fonction personnalisée. –

Questions connexes