1

我一直在做一些事情......

$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
}

需要strtotime吗?我可以对日期时间格式的字符串进行更直接的比较吗?

IE

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

这会一直有效吗?

4

3 回答 3

1

如果您将日期存储在字符串中,使用YYYY-MM-DD HH:MM:SS格式,您可以使用字母顺序:它将与日期顺序相同。

这意味着字符串的比较与日期的比较具有相同的结果。


我要补充一点,不使用UNIX 时间戳 会有一个优势:它们仅限于从 1970 到 2038 的范围,因为它们存储在 32 位整数上,表示自 1970-01-01 以来的秒数(取决于在您的系统上,范围可能更宽——但不是无限的)

于 2010-03-16T20:19:16.850 回答
1

是的,格式中字符串的字典顺序yyyy-mm-dd hh:ii:ss按预期工作。你甚至可以像这样对日期进行排序。

$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";
}

印刷

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

但请记住,对于格式不正确的字符串,您不会收到任何反馈。因此,如果可能存在格式错误的字符串,您最好也检查一下。如果这不是问题,string1>string2 就可以了。

编辑:您甚至可以让 MySQL 完成这项工作。如果在 php 中这样做更好/等于/更差取决于您实际想要实现的目标。例如

$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";
}

印刷

- 1000-01-01 00:00:00
+ 2010-03-16 21:22:19
- 1000-01-01 00:00:10
+ 1976-03-27 05:55:00
于 2010-03-16T20:24:37.123 回答
0

我通常使用 strtotime() 来比较日期作为时间戳值是安全的。

您可以通过编写 IF 语句并在其中一个中打印“statement 1 true”和在另一个中打印“statement 2 true”来进行检查。然后尝试更改 dt1 和 dt2 的值,看看效果如何。

于 2010-03-16T20:20:33.510 回答