Answers:
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或dmy格式的日期的歧义:如果分隔符为斜杠(/),则假定为美国m / d / y;相反,如果分隔符是破折号(-)或点(。),则采用欧洲dmy格式。
为了避免潜在的歧义,最好尽可能使用ISO 8601(YYYY-MM-DD)日期或DateTime :: createFromFormat()。
strtotime
接受某些格式。你什么都喂不了。这就是为什么DateTime::createFromFormat
应该使用而不是的原因strtotime
。可悲的是,这个答案有太多的投票让任何人都无法关注。这些天都是复制粘贴。
您需要小心使用m / d / Y和mdY格式。PHP认为/
均值m / d / Y和-
均值dmY。在这种情况下,我将明确描述输入格式:
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');
这样,您就不会受到某种解释的异想天开。
strtotime()
函数的怪癖要灵活得多。
要解析日期,您应该使用: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()构造函数,以确保为所需时区(而不是服务器默认时区)创建日期。
如果您的格式为dd-mm-yyyy,则在PHP中将无法正常工作。在PHP文档中,它们具有以下准则。
通过查看各个组成部分之间的分隔符,可以消除m / d / y或dmy格式的日期的歧义:如果分隔符为斜杠(/),则假定为美国m / d / y;相反,如果分隔符是破折号(-)或点(。),则采用欧洲dmy格式。
因此,您无法按照自己的意愿使用。当您尝试对此使用dd / mm / yyyy格式时,它将删除FALSE。您可以进行以下调整。
$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600
如果您希望使用美式排序(月,日,年)接受欧洲风格的日期(使用破折号或句点作为日,月,年),同时仍然接受其他格式,则可以扩展DateTime类:
/**
* Quietly convert European format to American format
*
* Accepts m-d-Y, m-d-y, m.d.Y, m.d.y, Y-m-d, Y.m.d
* as well as all other built-in formats
*
*/
class CustomDateTime extends DateTime
{
public function __construct(string $time="now", DateTimeZone $timezone = null)
{
// convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y (substr avoids microtime error)
$time = str_replace(['-','.'], '/', substr($time, 0, 10)) . substr($time, 10 );
parent::__construct($time, $timezone);
}
}
// usage:
$date = new CustomDateTime('7-24-2019');
print $date->format('Y-m-d');
// => '2019-07-24'
或者,您可以使函数接受mdY并输出Ymd:
/**
* Accept dates in various m, d, y formats and return as Y-m-d
*
* Changes PHP's default behaviour for dates with dashes or dots.
* Accepts:
* m-d-y, m-d-Y, Y-m-d,
* m.d.y, m.d.Y, Y.m.d,
* m/d/y, m/d/Y, Y/m/d,
* ... and all other formats natively supported
*
* Unsupported formats or invalid dates will generate an Exception
*
* @see https://www.php.net/manual/en/datetime.formats.date.php PHP formats supported
* @param string $d various representations of date
* @return string Y-m-d or '----' for null or blank
*/
function asYmd($d) {
if(is_null($d) || $d=='') { return '----'; }
// convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y
$d = str_replace(['-','.'], '/', $d);
return (new DateTime($d))->format('Y-m-d');
}
// usage:
<?= asYmd('7-24-2019') ?>
// or
<?php echo asYmd('7-24-2019'); ?>
要使用任何字符串创建日期,请使用:
$ date = DateTime :: createFromFormat('dmy H:i','01 -01-01 01:00'); echo $ date-> format('Ymd H:i');