DateTime::createFromFormat - PHP格式问题

11

PHP - DateTime::createFromFormat - 返回根据指定格式进行格式化后的新的DateTime对象。

以下代码有效:

$var = DateTime::createFromFormat('Ymd','20100809')->getTimestamp();

但是这会失败,提示如下:

在非对象上调用成员函数getTimestamp()

$var = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00')->getTimestamp();
4个回答

18
在这种情况下,M:S 部分是错误的。它应该是 i:s。请参阅 date() 函数手册
然而,这凸显出一个更深层次的概念问题:任何一个参数中的不正确输入都会导致致命错误,这对于生产应用程序来说是不好的行为。
createFromFormat 函数手册中可以得知:

返回一个新的 DateTime 实例或失败的 FALSE。

当调用无法从您提供的输入构建日期时,不会返回任何对象。
为避免因不正确的输入而导致致命错误,您需要(遗憾的是,这会破坏美好的链接)先检查成功:
 $var = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00');

 if ($var instanceof DateTime)
  echo $var->getTimestamp();

1
不要使用“m:s”和“i:s”。这里的“m”代表“月”。 - Artefacto

11

应该是这样的

DateTime::createFromFormat('Y/m/d H:i:s','2010/08/09 07:47:00')->getTimestamp()
                                    ^ ^

请查看date,以获取使用的格式。

在这种情况下,您也可以使用strtotime。 这将给出相同的结果:

strtotime('2010/08/09 07:47:00')

另一种方法:

date_create('2010/08/09 07:47:00')->getTimestamp()

请注意DateTime::createFromFormat在出错时会返回FALSE。您可以使用DateTime::getLastErrors()获取错误信息:

<?php
$d = DateTime::createFromFormat('Y/m/d H:M:S','2010/08/09 07:47:00');
var_dump($d);
var_dump(DateTime::getLastErrors());

输出如下:

bool(false) 
array(4) {
  ["warning_count"]=> int(0)
  ["warnings"]=> array(0) {
  }
  ["error_count"]=> int(3)
  ["errors"]=> array(1) {
    [14]=> string(13) "Trailing data"
  }
}

感谢DateTime::getLastErrors(),非常有用.. - fudu

0

使用s代替S,使用m代替M

  • s - 秒,带前导零
  • S - 月份中的英文序数后缀,2个字符,如st、nd、rd或th

  • m - 数字表示的月份,带前导零
  • M - 月份的短文本表示,三个字母,如Jan到Dec

0

H:M:S M代表月份的缩写,S代表月份中第几天(st, nd,rd,th) 请尝试使用H:i:s


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接