如果我有一个格式为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引用:
Dates in the m/d/y or d-m-y formats
are disambiguated by looking at the
separator between the various
components: if the separator is a
slash (/), then the American m/d/y is
assumed; whereas if the separator is a
dash (-) or a dot (.), then the
European d-m-y format is assumed.
号
这行不通。PHP将该输入解释为dd-mm-yyyy。
我在代码中添加了更多的解释,谢谢@konforce
阅读下一个答案以获得更好的解决方案
我有1970年,但不是全部…
@删除日期字符串很可能不是正确的日期。
是的,我用"str_replace('/'、'-'、$var);"after apply"日期('y-m-d'…)解决了这个问题,并且效果很好
如果我的日期是2017年12月2日,它就不起作用了
这不起作用,因为这个答案有误导性。strtotime接受某些格式。你不能吃任何东西。这就是为什么应该使用DateTime::createFromFormat而不是strtotime。不幸的是,这个答案有太多的赞成票,任何人都无法注意。这些天都是复制粘贴。
您需要注意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()函数的怪癖要灵活得多。
重要的是指出php datetime类自php版本5.2起可用,而createfromformat自5.3起可用。
和每个函数一样,您应该检查它是否满足您必须支持的最低版本。但PHP5.2eol是2011年1月。任何人都不应该再运行它了;迎合那些人只会让他们运行过时的、不安全的软件。
@马修是的,没错。但你从来没有,即使今天我发现一个php4.1版本仍然安装…
要分析日期,应使用:日期时间::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格式错误,应为"2013年10月16日";
请注意,这样检查$dateobj只会确保格式与掩码匹配,而不是日期实际有效。例如,99/99/2010这样的日期将通过此检查,因为它与M/D/Y匹配,但它不是您通常希望允许的日期。这个答案解决了这种情况->stackoverflow.com/a/10120725/995014
$d = new DateTime('10-16-2003');
$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16
号
编辑:您还可以将date time zone传递给date time()构造函数,以确保为所需时区(而不是服务器默认时区)创建日期。
我相信这会引发一个例外,因为第16个月是无效的。
重要的是指出php datetime类自php版本5.2起可用,getTimestamp自5.3起可用。
如果您的格式是dd-mm-yyyy,那么在PHP中,它将无法按预期工作。在PHP文档中,它们具有以下指导原则。
Dates in the m/d/y or d-m-y formats are disambiguated by looking at
the separator between the various components: if the separator is a
slash (/), then the American m/d/y is assumed; whereas if the
separator is a dash (-) or a dot (.), then the European d-m-y format
is assumed.
号
所以,你不能随心所欲地使用。当您尝试将dd/mm/yyyy格式与此一起使用时,它将删除false。您可以对以下内容进行调整。
$date ="23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
。
第一次约会
$_firstDate = date("m-d-Y", strtotime($_yourDateString));
。
对于新日期
$_newDate = date("Y-m-d",strtotime($_yourDateString));
就像我们有日期"2018年5月7日",我们需要日期"2018-05-07"作为MySQL兼容
if (!empty($date)) {
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
$date = date('Y-m-d', $timestamp);
}
它对我有用。享受:)