使用 strtotime 转换时的 PHP 日期问题,但如何正确执行此操作



使用以下代码尝试获取"Y-m-d",并且应该返回2016-05-10,但它返回2016-10-05。

// m-d-Y (Month-Day-Year)
$test_date = '05-10-2016';
// Convert to Y-m-d
$convert_date = date('Y-m-d', strtotime($test_date));

echo $convert_date;

如何返回"Y-m-d"? 不尝试使用explode('-', $test_date). 使用适当的时间函数可以做到这一点吗?

是的,为此使用DateTime对象:

$test_date = '05-10-2016';
$DateTime = DateTime::createFromFormat('m-d-Y', $test_date, new DateTimeZone('utc'));
var_dump($DateTime);

输出

object(DateTime)[8]
  public 'date' => string '2016-05-10 15:08:53.000000' (length=26)
  public 'timezone_type' => int 2
  public 'timezone' => string 'UTC' (length=3)

所以

echo $DateTime->format('Y-m-d'); //2016-05-10 

注意:请注意 m/d/y 或 d-m-y 格式的日期;如果分隔符是斜杠 (/),则假定为美式 m/d/y。如果分隔符是短划线 (-) 或点 (.),则假定采用欧洲 d-m-y 格式。为避免潜在错误,应尽可能使用 YYYY-MM-DD 日期或 date_create_from_format()。

来源:w3schools

您必须将"-"转换为"/"。

<?php// m-d-Y (Month-Day-Year)
$test_date = str_replace('-', '/', '05-10-2016');
// Convert to Y-m-d
$convert_date = date('Y-m-d', strtotime($test_date));
echo $convert_date; // 2016-05-10

>如果日期由-分隔,则strtotime采用欧洲格式的日期,如果按/分隔,则采用美国日期格式

注意:来自手册 strtotime()

m/d/y 或 d-m-y 格式

中的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠 (/),则假定为美式 m/d/y;而如果分隔符是短划线 (-) 或点 (.),则假定为欧洲 d-m-y 格式。但是,如果年份以两位数格式给出,并且分隔符是短划线 (-),则日期字符串将解析为 y-m-d。

为避免潜在的歧义,最好尽可能使用 ISO 8601 (YYYY-MM-DD) 日期或 DateTime::createFromFormat()。

因此,您只需str_replace -即可/

// m-d-Y (Month-Day-Year)
$test_date = '05-10-2016';
$test_date = str_replace('-', '/', $test_date);
// Convert to Y-m-d
$convert_date = date('Y-m-d', strtotime($test_date));
echo $convert_date;

或者最好还是使用 DateTime 对象

最新更新