Question

Je fais quelque chose le long des lignes de ..

$dt1 = '1000-01-01 00:00:00'; //really some val from db
$dt2 = '1000-01-01 00:00:10'; //another val maybe db maybe formatted

if(strtotime($dt1) > strtotime($dt2){
//do something
}

est le strtotime nécessaire? je peux faire une comparaison plus directe sur les chaînes de format datetime?

i.e..

if($dt1 > $dt2){
//do something
}

Est-ce que toujours?

Était-ce utile?

La solution

Oui, les de chaînes dans le format yyyy-mm-dd hh:ii:ss fonctionne comme prévu. Vous pouvez même trier les dates comme ça.

$dts = array(
  '1000-01-01 00:00:00',
  '2010-03-16 21:22:19',
  '1000-01-01 00:00:10',
  '1976-03-27 05:55:00', 
  '1976-03-27 05:54:00',
  '1968-08-21 12:00:00',
  '2001-01-01 00:00:01'
);

sort($dts);
foreach($dts as $dt) {
  echo $dt, "\n";
}

impressions

1000-01-01 00:00:00
1000-01-01 00:00:10
1968-08-21 12:00:00
1976-03-27 05:54:00
1976-03-27 05:55:00
2001-01-01 00:00:01
2010-03-16 21:22:19

Mais gardez à l'esprit que vous aurez pas de commentaires pour les chaînes qui sont pas dans le bon format. Donc, si pourrait être qu'il ya des chaînes malformées vous feriez mieux de vérifier cela aussi. Si ce n'est pas une préoccupation, chaine1> string2 est ok.

edit: Vous pouvez même laisser MySQL faire le travail. Si cela est mieux / égale / pire qu'elle en php faire dépend de ce que vous êtes en train d'essayer d'atteindre. Par exemple.

$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// setting up a sample table with some values
$pdo->exec('CREATE TEMPORARY TABLE foo (id int auto_increment, d datetime NOT NULL, primary key(id))');
$pdo->exec("INSERT INTO foo (d) VALUES ('1000-01-01 00:00:00'),('2010-03-16 21:22:19'),('1000-01-01 00:00:10'),('1976-03-27 05:55:00')");


$query = "
  SELECT
    d,
    (d>'1910-03-17 12:00:00') as flag
  FROM
    foo
";

foreach ( $pdo->query($query) as $row ) {
  echo $row['flag'] ? '+ ':'- ', $row['d'], "\n";
}

impressions

- 1000-01-01 00:00:00
+ 2010-03-16 21:22:19
- 1000-01-01 00:00:10
+ 1976-03-27 05:55:00

Autres conseils

Si vous avez des dates stockées dans la chaîne, en utilisant le format YYYY-MM-DD HH:MM:SS, vous pouvez utiliser la commande alphabétique :. Ce sera le même que l'ordre des dates

Ce qui signifie que les comparaisons sur les chaînes auront le même résultat que les comparaisons sur les dates.


Je voudrais ajouter qu'il y aurait un avantage à ne pas utiliser UNIX horodatages: ceux-ci sont limités à un gamme qui va 1970-2038, car ils sont stockés sur 32 bits entiers qui représentent un certain nombre de secondes écoulées depuis le 1970-01-01 (en fonction de votre système, la gamme pourrait être plus large - mais pas illimité)

J'utilise habituellement strtotime () pour être sûr en comparant les dates en tant que valeur d'horodatage.

Vous pouvez vérifier en écrivant à la fois les instructions IF et l'impression « déclaration 1 vrai » dans une seule et « déclaration 2 vrai » dans l'autre. Ensuite, essayez de changer les valeurs de DT1 et DT2 et voir comment cela se joue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top