在我的PHP应用程序中,当我使用PHP的date()
命令格式化它时,我从MySQL数据库中获取日期。我想整理一下,把它全部移到视图上,而不是检索。但我遇到了一些问题。
从数据库中获取日期后,我会在运行strtotime()
之后将其传递给应用程序的其余部分,以便date()
函数可以使用它们。这是一个好主意吗?还是我错过了更好更明显的东西?我正在处理的日期几乎都在DATE
类型,而不是DATETIME
。
所以,我得到了日期,可以使用date()
在网页上显示它。但有时候,我会从数据库中获取一些内容,只是为了插入数据库中的其他位置,并且必须通过后端搜索才能找到需要date()
种类的地方,这样才能将其分离到视图中。我的检索函数有助于返回strtotime($date_from_db)
,然后我在另一个表中创建新条目......并且所有新条目都必须通过验证和准备函数。这就是问题所在。我通过查看他们strtotime()
以及除了0000-00-00之外的其他内容来验证和准备日期。但是我无法在时间戳上运行strtotime()
;在我跑的测试中,如果给了我12/31/1969。所以我的问题:
strtotime()
?date()
而不是处理strtotime()
?除了看到它是否出现在1969年12月31日,因为我不知道我是否可以相信不能保持一致。除非这是一个有效的事情吗?答案 0 :(得分:1)
让mySQL在查询时间戳时处理它。
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
查询将根据您的需要检索格式化的时间戳,使您无需对字符串进行任何处理。
答案 1 :(得分:1)
作为一般方法,我非常想:
使用MySQL的日期时间类型存储日期/时间值,因为这将允许您有意义地查询MySQL中的数据,而无需使用> =“timestampvalueX”等。
以时间戳格式在PHP脚本中使用所有“实时”日期信息。
因此,您可能希望将所有与该格式相关的日期/时间相关信息存储为目标。您可以将其简单地转换为PHP可以在查询本身(使用UNIX_TIMESTAMP)或通过爆炸YYYY-MM-DD HH:MM:SS格式并使用PHP的mktime创建的格式一个“标准”时间戳。 (尽管您可能希望使用checkdate进行验证。)
回到您的具体问题:
如果传递时间戳,strotime将失败。
作为临时措施,您可以编写一个函数来检查提供的值是否为10位整数,并假设它是本机时间戳(如果是)。 (if(is_int($value) && strlen($value) == 10)...
)
事情的声音有点乱,所以作为一个合理的短期目标,你应该尝试在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;