【问题标题】:Date in a URL dd/mm/yyyyURL 中的日期 dd/mm/yyyy
【发布时间】:2017-09-30 10:59:57
【问题描述】:

我在 URL 中传递一个日期 (dd/mm/yyyy),格式如下:

http://www.website.com/_parameter=20/02/2000

我正在使用下面的 PHP 将其转换为 YYYY-MM-DD 格式。

<?php

    $D->query = '';

        if ($this->param('_parameter')) $D->query = date('Y-m-d', strtotime($this->param('_parameter'))); 

?>

我的数据库如下:

SELECT idtask FROM task WHERE unfinish=1 AND date LIKE '%".$D->query."%' "

以上返回如下:

1970-01-01

【问题讨论】:

  • 您应该真正格式化、缩进和使用变量,而不是试图在一行中完成所有操作。使事情难以调试。
  • 你真的需要一个? ?_parameter=20/02/2000

标签: php mysql date datetime


【解决方案1】:

使用strotime() 时,您需要确保您使用的是valid datetime format。否则strtotime() 将返回false 给你一个意想不到的值。

假设使用 XX/XX/XXXX 格式的日期是美国格式,这意味着前两位数字代表月份,接下来的两位数字代表月份中的日期,最后四位数字代表年份。使用破折号时,日期假定为欧洲格式。例如:

04/18/2017 = April 18, 2017
12/18/2017 = December 18, 2017
18-04-2017 = April 18, 2017
18-12-2017 = December 18, 2017

如果不小心切换了日期和月份strtotime()会返回false,因为日期无效。

18/04/2017 // error
18/12/2017 // error
04-18-2018 // error
12-18-2017 // error

上面的例子很简单。但是当日期不明确时,您可能会遇到问题。例如:

04/12/2017 = April 12, 2017
12/04/2017 = December 4, 2017
04-12-2017 = December 4, 2017
12-04-2017 = April 12, 2017

在上述示例中,通过切换日期和月份,我们仍然可以获得有效日期,这可能会导致您的应用程序出现意外结果。为了解决这些潜在问题,建议使用DateTime::createFromFormat() 解析日期广告返回一个DateTime() 对象,您可以从中get a Unix Timestampconvert the date into another format,或使用它与其他DateTime 对象进行比较。

// Parse US date format
$date1 = DateTime::createFromFormat('m/d/Y', '04/18/2017');

// Get Unix timestamp of 1493581268
$timestamp = $date1->getTimestamp();

// Parse European date format
$date2 = DateTime::createFromFormat('d-m-Y', ''18-04-2017);

// Get MySQL format (ISO-8601) of 2017-04-18
$mysqlDate = $date2->format('Y-m-d');

另请参阅:


对于您的具体情况,以下代码将起作用:

$date = $date1 = DateTime::createFromFormat('m/d/Y', '20/02/2000');
$D->query = $date->format('Y-m-d'); // 2000-02-20

【讨论】:

  • 在这里我要发布一个两行答案,呵呵。 +1!
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多