我应该在这里使用'strtotime'吗?

时间:2009-11-22 10:38:09

标签: php

我有一个网站,我从mysql表中显示信息,例如上次更改的日期。 在mysql中,字段类型是'TIMESTAMP'... 我有这样的代码:

$postdate = date( "j F", strtotime( $row['insert_date'] ) ); // Getting the date from the database
$posthour = date( "H:i", strtotime( $row['insert_date'] ) ); // Getting the time from the database
    if ($postdate == date("j F")) {$postdate = "Today";}
    if ($postdate == date('j F', strtotime('-1 day'))) {$postdate = "Yesterday";}
    if ($postdate == date('j F', strtotime('-2 day'))) {$postdate = "Day before yesterday";}

我听说strtotime是一个缓慢的功能。有没有人有任何关于如何重写这个以提高性能的建议?

注意:如果你建议的话,mysql表中的TIMESTAMP可能会改变,那没问题!

由于

4 个答案:

答案 0 :(得分:3)

我会选择这样的东西(使用DATEDIFF):

SELECT ..., DATEDIFF( `insert_date` , CURRENT_TIMESTAMP ) AS diff_insert, ...
FROM xxxxxx ...

然后在php:

if ($row['diff_insert'] == 0) {
  $postdate = "Today";
} else if ($row['diff_insert'] == -1) {
  $postdate = "Yesterday";
} else if ($row['diff_insert'] == -2) {
  $postdate = "Day before yesterday";
}

答案 1 :(得分:1)

如上所述,你可以在MySQL中使用DATEDIFF,但是从PHP 5.3开始,你也可以在DateTime类上使用'diff'方法。

示例:

<?php 
 $dateObject = new DateTime(); // No arguments means 'now'
 $otherDateObject = new DateTime('2008-08-14 03:14:15');
 $diffObject = $dateObject->diff($otherDateObject)); 
 echo "Days of difference: ". $diffObject->days; 
?>

'DateTime'diff函数返回DateInterval对象。该对象由与差异相关的变量组成。您可以像上面的示例一样查询天,小时,分钟,秒。

请参阅手册:http://nl2.php.net/manual/en/datetime.diff.php。可悲的是,这是一个PHP 5.3&gt;唯一的功能。

答案 2 :(得分:0)

修改您的SELECT语句以使用UNIX_TIMESTAMP(),这将更有效strtotime。 e.g:

SELECT ... UNIX_TIMESTAMP(`insert_date`) AS `insert_datestamp`, ...

然后:

$posthour = date( 'H:i', $row['insert_datestamp']);
// calculate the difference between today (starting at midnight) and the posted date
// 86400 is the number of seconds in a day - should really use a constant here
$diff_days=round( (mktime(0, 0, 0) - $row['insert_datestamp']) / 86400);

switch($diff_days) :

  case 0: $postdate = 'Today'; break;
  case 1: $postdate= 'Yesterday'; break;
  case 2: $postdate='Day before yesterday'; break;
  default: $postdate=date('j F', $row['insert_datestamp']); break;

endswitch;

最好使用switch语句,而不是使用多个if语句。

答案 3 :(得分:0)

您可以使用MySQL UNIX_TIMESTAMP()函数来获取时间戳,然后在PHP date()函数中使用它,而不是在它通常返回的日期字符串上调用strtotime()。

此外,您可以使用MySQL DATEDIFF()函数来获取今天和数据库中日期之间的天数。

SELECT DATEDIFF(NOW(), `my_date`) AS 'days_since_post',
       UNIX_TIMESTAMP(`my_date`) AS 'my_date_stamp'
FROM `my_table`;

然后在PHP中:

<?php
switch($row['days_since_post']) {
    case 0: $post_day = 'Today'; break;
    case 1: $post_day = 'Yesterday'; break;
    default: $post_day = date('M jS, Y'); break;
}
$post_time = date('H:i', $row['my_date_stamp']);

echo "Posted: {$post_day} at {$post_time}";
?>