关于php:将字符串转换为Date和DateTime

Converting string to Date and DateTime

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


在第一次约会时使用strtotime(),然后使用date('Y-m-d')将其转换回:

1
2
3
4
5
6
$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.


您需要注意M/D/Y和M-D-Y格式。php认为/表示m/d/y,-表示d-m-y。在这种情况下,我将明确描述输入格式:

1
$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

这样的话,你就不会对某一种解释产生兴趣了。


要分析日期,应使用:日期时间::CreateFromFormat();

前任:

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

但是,要小心,因为这会导致:

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

您实际上需要检查格式化是否正常,首先:

1
2
3
4
5
6
7
$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日";


1
2
3
4
$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()构造函数,以确保为所需时区(而不是服务器默认时区)创建日期。


如果您的格式是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。您可以对以下内容进行调整。

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


第一次约会

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

对于新日期

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


就像我们有日期"2018年5月7日",我们需要日期"2018-05-07"作为MySQL兼容

1
2
3
4
5
6
7
if (!empty($date)) {
    $timestamp = strtotime($date);
    if ($timestamp === FALSE) {
         $timestamp = strtotime(str_replace('/', '-', $date));
     }
         $date = date('Y-m-d', $timestamp);
  }

它对我有用。享受:)