用PHP计算日期

时间:2010-02-18 18:21:00

标签: php

我有一个关于用PHP计算日期的一般性问题。

如果我在我的数据库中存储这样的时间戳,会发生什么:

$db_timestamp = '2010-01-31 00:00:00';

然后运行一个每日脚本,检查自数据库中保存时间戳以来是否已经过了一个月:

if ($db_timestamp == make_unix_timestamp(mktime(0, 0, 0, date("m") - 1, date("d"), date("Y")), TRUE, 'eu'))) 
{ 
    do something 
};

我的问题是我刚刚意识到这对所有日期都不适用。在这种情况下,2月份不会调用“做某事”,因为2月没有第31天。关于如何实现这样的事情的任何想法?

5 个答案:

答案 0 :(得分:3)

首先,您的DBMS应具有日期/时间的数据类型。它们都以类似的方式存储时间戳。

如果需要返回PHP可以理解的时间戳,MySQL会提供一个名为UNIX_TIMESTAMP()的函数。

SELECT UNIX_TIMESTAMP(`createTime`) FROM `articles`;

相反的功能称为FROM_UNIXTIME()

INSERT INTO `articles` (`createTime`) VALUES ( FROM_UNIXTIME(12345678) );

MySQL(或其他DBMS,但我以MySQL为例)还有许多其他函数来计算时差。例如,要了解文章是否超过一个月,请使用DATE_SUB()

SELECT * FROM `articles`
  WHERE `article`.`createTime` <= DATE_SUB(NOW(), INTERVAL 1 MONTH);

(在MySQL5及以上版本中,您也可以这样写)

SELECT * FROM `articles`
  WHERE `article`.`createTime` <= (NOW() - INTERVAL 1 MONTH);

答案 1 :(得分:1)

$ts = strtotime($db_timestamp);
if ($ts < (time() - 2592000))
{
   do something;
}

2592000秒= 30天

答案 2 :(得分:1)

您可以使用date_diff http://us3.php.net/manual/en/datetime.diff.php 或者将数据库中的时间戳与

进行比较
strtotime("-1 month");

答案 3 :(得分:1)

您可以使用查询检查时间戳:

MySQL的:

select date from table where date < now() - INTERVAL 1 MONTH;

答案 4 :(得分:0)

这取决于你如何考虑“一个月”。

如果“一个月”意味着“30天”,解决方案是将您从数据库获取的时间戳与当前时间戳进行比较:

$db_timestamp = strtotime('2010-01-31');
$current_timestamp = time();
var_dump( ($current_timestamp - $db_timestamp) / (24*3600) );

如果差异是30天......就是这样。


几个笔记:

  • strtotime将日期转换为UNIX时间戳 - 即自1970-01-01以来的秒数
  • time返回当前的UNIX时间戳
  • 你可以比较时间戳:它们只代表几秒钟;并且每天有24 * 60 * 60秒; - )