【问题标题】:PHP DateTime parsing time instead of datePHP DateTime 解析时间而不是日期
【发布时间】:2014-07-14 03:06:29
【问题描述】:

我正在尝试用 PHP 准备一个 MySQL 查询。我的问题是 PHP 对待日期的方式与 MySQL 不同。

在 MySQL 中,“2000”是 2000 年,在 PHP 中是晚上 8 点。

$date1 = new DateTime('2000-01-01');
echo $date1->format("Y-m-d H:i:s"); // 2000-01-01 00:00:00
$date2 = new DateTime('2000-01');
echo $date2->format("Y-m-d H:i:s"); // 2000-01-01 00:00:00

// This gets 8 PM instead of the year 2000
$date3 = new DateTime('2000');
echo $date3->format("Y-m-d H:i:s"); // 2014-07-14 20:00:00

$date4 = DateTime::createFromFormat("Y-m-d H:i:s", '2000');
echo $date4->format("Y-m-d H:i:s"); // PHP Fatal error:  Call to a member function format() on a non-object

我只想解析包含在日期之后的时间。

有没有办法告诉它在 PHP 中优先解析年份而不是时间?

【问题讨论】:

  • 垃圾进垃圾出 (GIGO) 的经典示例

标签: php mysql datetime


【解决方案1】:

如果您只打算过一年,就不能指望DateTime 以特定格式解析日期。

但是,您可以通过将感叹号作为格式的一部分传递来清除所有其他日期字段:

$date = DateTime::createFromFormat('!Y', '2000');
echo $date->format('r'); // Sat, 01 Jan 2000 00:00:00: +0000

【讨论】:

    【解决方案2】:

    PHP DateTime construct 第一个参数是日期/时间字符串。 Date and Time Formats 中解释了有效格式。对于您的情况,这些将是 Compound Formats

    您不应该只是折腾以任何可能的方式格式化的字符串。您/开发人员是唯一能够准确知道输入日期格式的人,这意味着,开发人员负责事先清理/验证DateTime 类中输入所需的数据。

    tl;dr 不,没有办法确定 DateTime 类中内置的解析的优先级。你用你自己的代码来做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2015-01-12
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      相关资源
      最近更新 更多