0

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

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

所以,我得到了日期,可以用来date()在网页上显示它。但有时,我会从数据库中获取一些东西,只是为了插入到数据库的其他地方,并且不得不在后端寻找需要date()的地方,这违背了将其分离到视图中的目的。我的检索功能有用地返回strtotime($date_from_db),然后我在另一个表中创建新条目......所有新条目都必须通过验证和准备功能。这就是问题所在。我通过查看日期是否strtotime()为 0000-00-00 以外的内容来验证和准备日期。但我不能strtotime()在时间戳上运行;在我跑的测试中,如果给了我 1969 年 12 月 31 日。所以我的问题:

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

4 回答 4

1

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

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

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

于 2011-01-11T17:52:11.453 回答
1

作为一般方法,我很想:

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

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

因此,您可能希望以该格式存储所有与日期/时间相关的信息作为目标。您可以简单地将其转换为 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 中的使用。

于 2011-01-11T17:58:08.857 回答
0

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

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

strtotime()在时间戳上运行将返回 0,当您通过date(). 检查strtotime结果 0 应该这样做。

于 2011-01-11T17:52:50.053 回答
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;
于 2021-08-04T18:18:21.347 回答