91 votes

Comment vérifier si une date est dans une plage donnée?

Si vous avez un et , comment pouvez-vous vérifier si une date donnée par l’utilisateur tombe dans cette fourchette ?

par exemple

Pour l’instant, que les dates sont des chaînes, serait-il utile des pour convertir en nombres entiers timestamp ?

133voto

ConroyP Points 24021

Les convertir en timestamps est la meilleure solution , en utilisant strtotime , par exemple

 $start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28';

check_in_range($start_date, $end_date, $date_from_user);


function check_in_range($start_date, $end_date, $date_from_user)
{
  // Convert to timestamp
  $start_ts = strtotime($start_date);
  $end_ts = strtotime($end_date);
  $user_ts = strtotime($date_from_user);

  // Check that user date is between start & end
  return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}
 

55voto

pcguru Points 1535

Utilisez la classe DateTime si vous avez PHP 5.3+. Plus facile à utiliser, de meilleures fonctionnalités.

DateTime prend en charge en interne les fuseaux horaires, les autres solutions étant à vous de le gérer.

 <?php
$fromUser = new DateTime("2012-03-01");

if (
  $fromUser > new DateTime("2012-02-01 00:00:00") &&
  $fromUser < new DateTime("2012-04-30 23:59:59"))
{
    return true;
}

return false;
 

47voto

spencer7593 Points 29263

Il n'est pas nécessaire de convertir le timestamp de faire la comparaison, étant donné que les chaînes de caractères sont validés que les dates dans "YYYY-MM-DD' format canonique.

Ce test:

( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )

donnée:

$start_date     = '2009-06-17';
$end_date       = '2009-09-05';
$date_from_user = '2009-08-28';

REMARQUE: la Comparaison des chaînes de caractères comme cela permet aux "non-valide" dates par exemple (décembre 32e ) '2009-13-32" et bizarrement formaté cordes 2009/3/3", tels qu'une comparaison de chaîne ne sera PAS équivalent à une date ou timestamp de comparaison. Cela ne fonctionne que si les valeurs de date dans les cordes sont en UNIFORME et CANONIQUE format.

EDIT pour ajouter une note ici, de s'attarder sur ce qui est évident.

Par COHÉRENCE, je veux dire par exemple que les chaînes de caractères comparaison doit être dans un format identique: le mois doit toujours être deux personnages, la journée doit toujours être deux personnages, et le caractère de séparation doit toujours être un tableau de bord. On ne peut pas comparer de manière fiable "chaînes" qui ne sont pas de caractère de quatre ans, à deux caractères mois, deux caractères de la journée. Si nous avions un mélange de caractère et de deux caractères mois dans les cordes, par exemple, nous aurions résultat inattendu lorsque nous avons comparé, '2009-9-30' de '2009-10-11'. Nous humainement voir "9" comme étant moins "10", mais une comparaison de chaîne verrez '2009-9' plus de '2009-1'. Nous n'avons pas nécessairement besoin d'avoir un tiret séparateur de caractères; on pourrait tout aussi fiables et comparer les chaînes en 'YYYYMMDD' ; si il y a un caractère de séparation, il doit toujours être là et d'être toujours la même.

Par CANONIQUE, je veux dire qu'un format qui entraînera des chaînes de caractères qui seront triées en ordre de date. Qui est, la chaîne de disposer d'une représentation de "l'année" d'abord, puis de "mois", "jour". Nous ne pouvons pas fiable comparer les chaînes en 'MM-DD-YYYY' format, parce que ce n'est pas canonique. Une comparaison de chaîne de comparer l' MM (mois) avant d'comparé YYYY (année) depuis la chaîne de la comparaison des œuvres de gauche à droite.) Un gros avantage de la "YYYY-MM-DD' chaîne de format est qu'il est canonique; les dates représentées dans ce format peut sûrement être comparé comme des chaînes de caractères.

[ADDENDUM]

Si vous allez faire du php horodatage de conversion, d'en connaître les limites.

Sur certaines plates-formes, php ne prend pas en charge les valeurs timestamp plus tôt que 1970-01-01 et/ou au plus tard 2038-01-19. (C'est la nature même de le timestamp unix de l'entier de 32 bits.) Les versions ultérieures pf (php 5.3?) sont censés s'en occuper.

Le fuseau horaire peut également être un problème, si vous n'êtes pas prudent d'utiliser le même fuseau horaire lors de la conversion de la chaîne d'horodatage et de timestamp retour à la chaîne.

HTH

4voto

Stan R. Points 8967
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)

if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
   //..falls within range
}

3voto

Glen Points 13521

Convertissez les deux dates en horodatages puis faites

pseudocode:

 if date_from_user > start_date && date_from_user < end_date
    return true
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X