将字符串转换为日期和日期时间

367

如果我有一个格式为mm-dd-YYYY的PHP字符串(例如,10-16-2003),如何正确地将其转换为Date,然后再转换为YYYY-mm-dd格式的DateTime? 我之所以要求同时转换成DateDateTime是因为我需要在不同的位置使用它们。


最好在 PHP 5 和 7 中使用 DateTime。详细博客:http://sforsuresh.in/converting-string-to-date-and-datetime-PHP - Suresh Kamrushi
如何将2020年1月10日转换为时间戳? - Amit Bera
13个回答

577

使用strtotime()函数将您的第一个日期转换为时间戳,然后再使用date('Y-m-d')函数将其转换回日期格式:

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;
// 2003-10-16
请注意,在 strtotime() 函数中使用正斜杠 / 和连字符 - 之间存在差异。引用自 php.net:

采用 m/d/y 或 d-m-y 格式的日期根据各个组件之间的分隔符进行区分:如果分隔符是正斜杠(/),则假定为美国格式 m/d/y;而如果分隔符是破折号(-)或句点(.),则假定为欧洲格式 d-m-y。

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


13
无法生效,PHP会将输入解释为DD-MM-YYYY格式。 - Matthew
我在我的代码中添加了一些更多的解释,感谢@konforce。 - Ibu
9
请阅读下一个答案以获取更好的解决方案。 - Manuel Bitto
1
是的,我用"str_replace('/', '-', $var);"解决了这个问题,然后应用了"date('Y-m-d'....",现在它能够正常工作。 - user3402040
9
这个答案有误导性,因此无法起作用。strtotime 只接受特定的格式,不能随意输入。这就是为什么应该使用 DateTime::createFromFormat 而不是 strtotime。遗憾的是,这个答案得到了太多的赞同,以至于没有人会注意到它。现在的情况都是复制粘贴。 - N.B.
显示剩余7条评论

525

在使用m/d/Y和m-d-Y格式时需要小心。PHP将/解释为m/d/Y,将-解释为d-m-Y。在这种情况下,我会明确描述输入格式:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
那样你就不会受制于某种特定的解释。

48
为什么这不是被接受的答案呢?这种方法比依赖strtotime()函数更加灵活。 - jzimmerman2011
10
需要翻译的内容:It's important to point that php DateTime class is available since PHP version 5.2 and createFromFormat since 5.3。翻译后的结果:需要注意的是,自 PHP 5.2 版本开始就可以使用 PHP DateTime 类,而 createFromFormat 函数则从 PHP 5.3 版本开始提供。 - Diego Shevek
16
与每个函数一样,您应检查它是否符合您必须支持的最低版本。但是,PHP 5.2 EOL 是在2011年1月。现在没有人应该再使用它了;迎合这些人只会使他们运行过时且不安全的软件。 - Matthew
@Matthew 是的,正确。但你永远不知道,即使今天我发现还安装了PHP4.1版本... - Roland
这应该是最好的答案+1。 - Md Ashraful Islam
1
我同意评论者的观点,认为这个应该成为被采纳的答案,除非你不得不使用PHP 4.x。如果是这种情况,日期格式化应该是你最不用担心的事情。 - UncaAlby

34

要解析日期,您应该使用:DateTime :: createFromFormat();

示例:

$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");

然而需要小心,因为这会与以下内容冲突:

PHP Fatal error: Call to a member function format() on a non-object 

你实际上需要首先检查格式是否正确:

$dateDE = "16/10/2013";
$dateObj = \DateTime::createFromFormat("d.m.Y", $dateDE);
if (!$dateObj)
{
    throw new \UnexpectedValueException("Could not parse the date: $date");
}
$dateUS = $dateObj->format("m/d/Y");

现在,你不会再遇到程序崩溃的情况,而是会得到一个异常,你可以捕获、传播等操作。

$dateDE有错误的格式,应该为"16.10.2013"。


请注意,以这种方式检查$dateObj只能确保格式与掩码匹配,而不能确保日期实际上是有效的。例如,像99/99/2010这样的日期将通过此检查,因为它与m/d/Y匹配,但这不是您通常想要允许的日期。此答案解决了这种情况-> https://dev59.com/RGLVa4cB1Zd3GeqPx5ut#10120725 - Kilian Perdomo Curbelo

26
$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

编辑:你也可以将DateTimeZone传递给DateTime()构造函数,以确保创建所需时区的日期,而不是服务器默认的时区。


6
我认为这会引发异常,因为月份16是无效的。 - Matthew
重要的是指出,自PHP 5.2版本以来,php DateTime类可用,而_getTimestamp_则自5.3版本开始。 - Diego Shevek

10

既然没有人提到这一点,这里有另一种方法:

$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");

1
这是最优雅的解决方案。在我看来很棒。太棒了。 - Adam Evers

9

要从任何字符串创建日期,您可以使用:

$date = DateTime::createFromFormat('d-m-y H:i', '01-01-01 01:00');
echo $date->format('Y-m-d H:i');

4

如果您的日期格式为“07/May/2018”,需要将其转换为“2018-05-07”以使其与MySQL兼容,您可以使用以下方法:

if (!empty($date)) {
  $timestamp = strtotime($date);
  if ($timestamp === FALSE) {
    $timestamp = strtotime(str_replace('/', '-', $date));
  }
  $date = date('Y-m-d', $timestamp);
}

3

首次约会

$_firstDate = date("m-d-Y", strtotime($_yourDateString));

对于新日期

$_newDate = date("Y-m-d",strtotime($_yourDateString));

3
如果您使用的是格式为dd-mm-yyyy,那么在PHP中它将无法按预期工作。在PHP文档中,它们有以下指导方针。
根据各个组成部分之间的分隔符来消除m/d/y或d-m-y格式中的日期歧义:如果分隔符是斜杠(/),则假定为美国的m/d/y格式;而如果分隔符是短划线(-)或句点(.),则假定为欧洲的d-m-y格式。
因此,您不能随意使用。当您尝试使用dd/mm/yyyy格式时,它将删除FALSE。您可以进行如下调整。
$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
  $timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600

1

以下方法对我有效:

$stringDate = "2022-02-24T17:15:00"; (如果只发送日期"2022-02-24",则填充时间为00:00:00)。

$dateFormat = new DateTime($miStringDate);


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

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