如何对时间戳进行strtotime,或者如何最好地处理SQL日期?

时间:2011-01-11 17:44:24

标签: php mysql date strtotime

在我的PHP应用程序中,当我使用PHP的date()命令格式化它时,我从MySQL数据库中获取日期。我想整理一下,把它全部移到视图上,而不是检索。但我遇到了一些问题。

从数据库中获取日期后,我会在运行strtotime()之后将其传递给应用程序的其余部分,以便date()函数可以使用它们。这是一个好主意吗?还是我错过了更好更明显的东西?我正在处理的日期几乎都在DATE类型,而不是DATETIME

所以,我得到了日期,可以使用date()在网页上显示它。但有时候,我会从数据库中获取一些内容,只是为了插入数据库中的其他位置,并且必须通过后端搜索才能找到需要date()种类的地方,这样才能将其分离到视图中。我的检索函数有助于返回strtotime($date_from_db),然后我在另一个表中创建新条目......并且所有新条目都必须通过验证和准备函数。这就是问题所在。我通过查看他们strtotime()以及除了0000-00-00之外的其他内容来验证和准备日期。但是我无法在时间戳上运行strtotime();在我跑的测试中,如果给了我12/31/1969。所以我的问题:

  1. 是否有可能以某种方式在时间戳上运行strtotime()
  2. 如果没有,是否有一种简单的方法可以知道变量是否是时间戳?所以我可以简单地在其上运行date()而不是处理strtotime()?除了看到它是否出现在1969年12月31日,因为我不知道我是否可以相信不能保持一致。除非这是一个有效的事情吗?
  3. 我完全错了吗?

4 个答案:

答案 0 :(得分:1)

让mySQL在查询时间戳时处理它。

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

查询将根据您的需要检索格式化的时间戳,使您无需对字符串进行任何处理。

答案 1 :(得分:1)

作为一般方法,我非常想:

  1. 使用MySQL的日期时间类型存储日期/时间值,因为这将允许您有意义地查询MySQL中的数据,而无需使用> =“timestampvalueX”等。

  2. 以时间戳格式在PHP脚本中使用所有“实时”日期信息。

  3. 因此,您可能希望将所有与该格式相关的日期/时间相关信息存储为目标。您可以将其简单地转换为PHP可以在查询本身(使用UNIX_TIMESTAMP)或通过爆炸YYYY-MM-DD HH:MM:SS格式并使用PHP的mktime创建的格式一个“标准”时间戳。 (尽管您可能希望使用checkdate进行验证。)

    回到您的具体问题:

    1. 如果传递时间戳,strotime将失败。

    2. 作为临时措施,您可以编写一个函数来检查提供的值是否为10位整数,并假设它是本机时间戳(如果是)。 (if(is_int($value) && strlen($value) == 10)...

    3. 事情的声音有点乱,所以作为一个合理的短期目标,你应该尝试在MySQL和PHP中标准化使用。

答案 2 :(得分:0)

  

但是我不能在时间戳上运行strtotime();在我跑的测试中,如果给了我12/31/1969。

12/31/1969是UNIX纪元的开始,1-1-1970,时区偏移。

在时间戳上运行strtotime()将返回0,当您通过date()运行时,它将以1-1-1970 UTC结束。检查strtotime结果为0应该这样做。

答案 3 :(得分:0)

简而言之,在从数据库返回的时间戳前添加一个“@”符号,您可以像使用普通时间戳一样使用它。建议将此解决方案作为一种方法,尽可能减少与提问者熟悉的技术和方法的分歧(尽量减少工作量/混淆)。

您的数据库返回一个时间戳版本,它是一个字符串,而 PHP 时间戳是一个时间戳对象。

使用“@”技巧,您可以一致地编码。无论您是处理 PHP 中的时间戳对象还是 MYSQL 返回的字符串,都没有关系。

$ts1 = time();       //a PHP timestamp object
$ts2 = '1628100056'; //a string, like one coming back from a timestamp field in a MYSQL DB

//see here how they are both treated the same...
$date1 = date('Y-m-d',strtotime('@'.$ts1));
$date2 = date('Y-m-d',strtotime('@'.$ts2));

echo "from object: ".$date1;
echo "<BR>";
echo "from string: ".$date2;

应该从时间戳字段中检索来自数据库的时间戳,因此:

SELECT UNIX_TIMESTAMP(my_timestamp_field) FROM my_table;