如果我有一个格式为mm-dd-YYYY
的PHP字符串(例如,10-16-2003),如何正确地将其转换为Date
,然后再转换为YYYY-mm-dd
格式的DateTime
? 我之所以要求同时转换成Date
和DateTime
是因为我需要在不同的位置使用它们。
如果我有一个格式为mm-dd-YYYY
的PHP字符串(例如,10-16-2003),如何正确地将其转换为Date
,然后再转换为YYYY-mm-dd
格式的DateTime
? 我之所以要求同时转换成Date
和DateTime
是因为我需要在不同的位置使用它们。
使用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()。
strtotime
只接受特定的格式,不能随意输入。这就是为什么应该使用 DateTime::createFromFormat
而不是 strtotime
。遗憾的是,这个答案得到了太多的赞同,以至于没有人会注意到它。现在的情况都是复制粘贴。 - N.B.在使用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');
那样你就不会受制于某种特定的解释。strtotime()
函数更加灵活。 - jzimmerman2011要解析日期,您应该使用: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"。
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
编辑:你也可以将DateTimeZone传递给DateTime()构造函数,以确保创建所需时区的日期,而不是服务器默认的时区。
既然没有人提到这一点,这里有另一种方法:
$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");
要从任何字符串创建日期,您可以使用:
$date = DateTime::createFromFormat('d-m-y H:i', '01-01-01 01:00');
echo $date->format('Y-m-d H:i');
如果您的日期格式为“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);
}
首次约会
$_firstDate = date("m-d-Y", strtotime($_yourDateString));
对于新日期
$_newDate = date("Y-m-d",strtotime($_yourDateString));
$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
以下方法对我有效:
$stringDate = "2022-02-24T17:15:00"; (如果只发送日期"2022-02-24",则填充时间为00:00:00)。
$dateFormat = new DateTime($miStringDate);