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

如果我有一个格式为mm-dd-YYYY的PHP字符串(例如,10-16-2003),如何正确地将其转换为Date,然后转换为YYYY-mm-dd格式的DateTime ?我同时要求DateDateTime的唯一原因是因为我需要一个在一个地方,而另一个在不同的地方。

1100477 次浏览

在第一次约会时使用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格式的日期 可以通过查看 在不同的 组件:如果分隔符为a /,则美式的m/d/y为 假设;而如果分隔符是a 破折号(-)或点(.),然后是 假设为欧洲d-m-y格式

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

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


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

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

您需要小心使用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');

这样你就不会因为某个解释而心血来潮。

要解析日期,你应该使用: DateTime: createFromFormat (); < / p >

例:

$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”;

第一次约会

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

新日期

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

如果你的格式是dd-mm-yyyy,那么在PHP中它将不能正常工作。在PHP文档中,他们有以下指导方针。

m/d/y或d-m-y格式的日期通过查看来消除歧义 各部件之间的分离器:如果分离器是一个 /,则假定美式的m/d/y;然而如果 分隔符是一个破折号(-)或一个点(.),然后是欧洲d-m-y格式 假定. < / p >

所以,你不能随心所欲地使用。当你尝试使用dd/mm/yyyy格式时,它将删除FALSE。你可以用下面的方法进行调整。

$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
$timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600

如果您的日期格式为&;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);
}

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

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

如果你希望在欧式格式(使用破折号或句号作为日、月、年)同时仍然接受其他格式中接受美式排序(月、日、年)的日期,你可以扩展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'

或者,你可以让一个函数接受m-d-Y并输出Y-m-d:

/**
* 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('d-m-y H:i', '01-01-01 01:00');
echo $date->format('Y-m-d H:i');

如果您想获取当月的最后一天,可以使用以下代码。

$last_day_this_month  = date('F jS Y', strtotime(date('F t Y')));

我尝试了上面所有的答案,但失败了,在我的情况下,我构建了一个函数,获得以下格式“YYYY/mm/dd”的日期字符串。所以我认为像这样爆炸弦会更好:

$old_date = explode('/', $coming_date_str);

$new_data = $old_date[0].'-'.$old_date[1].'-'.$old_date[2]; //将字符串转换为上述所有帖子并完成

$new_date = date('Y-m-d', strtotime($new_data));
$new_date = DateTime::createFromFormat("Y-m-d", new_date);

对我来说,这样做很有效:

$stringDate = "2022-02-24T17:15:00"; (如果你只发送日期"2022-02-24"它将时间填充为00:00:00).

$dateFormat = new DateTime($miStringDate);