从php数组创建新日期

从php数组创建新日期,php,date,datetime,Php,Date,Datetime,我正在尝试从数组创建一个日期。有什么功能可以实现这一点吗?我所知道的是我可以访问字段并从中创建日期 'endDate' => array( 'month' => '05', 'day' => '30', 'year' => '2017', 'hour' => '10', 'min' => '48', 'meridian' => 'pm' ) 我使用D

我正在尝试从数组创建一个日期。有什么功能可以实现这一点吗?我所知道的是我可以访问字段并从中创建日期

'endDate' => array(
        'month' => '05',
        'day' => '30',
        'year' => '2017',
        'hour' => '10',
        'min' => '48',
        'meridian' => 'pm'
    )

我使用
DateTime::createFromFormat
vsprintf
从数组构造时间字符串,并得出以下结论:

<?php
$endDate = array(
    'month' => '05',
    'day' => '30',
    'year' => '2017',
    'hour' => '10',
    'min' => '48',
    'meridian' => 'pm'
);

$date = DateTime::createFromFormat('d/m/Y h:i a', vsprintf('%s/%s/%s %s:%s %s', [
    $endDate['day'],
    $endDate['month'],
    $endDate['year'],
    $endDate['hour'],
    $endDate['min'],
    $endDate['meridian'],
]));

echo $date->format('d/m/Y h:i a');
实际上,您甚至可能不需要使用
DateTime
,但我建议您尽可能地进一步操作它(添加时间间隔或更改格式),您可能只需执行以下操作:

printf('%s/%s/%s %s:%s %s', [
    $endDate['day'],
    $endDate['month'],
    $endDate['year'],
    $endDate['hour'],
    $endDate['min'],
    $endDate['meridian'],
]

演示:

您可以将您的值组合成一个值日期字符串,然后创建调用
strotime
DateTime
的新实例

$endtime = [
    'month' => '05',
    'day' => '30',
    'year' => '2017',
    'hour' => '10',
    'min' => '48',
    'meridian' => 'pm'
];
$datetime = DateTime::createFromFormat("Y-m-d h:i A", "{$endtime['year']}-{$endtime['month']}-{$endtime['day']} {$endtime['hour']}:{$endtime['min']} {$endtime['meridian']}");
$time = strtotime("{$endtime['year']}-{$endtime['month']}-{$endtime['day']} {$endtime['hour']}:{$endtime['min']} {$endtime['meridian']}");

没有API函数可以实现这一点。您可以实现自己的方法,其中应如下所示:

/**
 * Convert given array to DateTimeObject
 * @param $dateArr array containing 'day', 'month', 'year', 'hour', 'min', 'meridian'
 * @return DateTime object
 *
 * 'day' and 'month' must always be 2 numbers
 * 'year' must always be 4 numbers
 * 'hour' must always be 2 numbers (01-12)
 * 'min' must always be 2 numbers (00-59)
 * 'meridian' must always be 2 letters ('am' or 'pm')
 */
function createEndDate($dateArr) {
    return DateTime::createFromFormat('dmYhia',
        $dateArr['day'] . 
        $dateArr['month'] . 
        $dateArr['year'] .
        $dateArr['hour'] .
        $dateArr['min'] .
        strtolower($dateArr['meridian']));
}
代码示例:

$yourArr => array(
    'month' => '05',
    'day' => '30',
    'year' => '2017',
    'hour' => '10',
    'min' => '48',
    'meridian' => 'pm'
)

$endDate = createEndDate($yourArr);
// see http://php.net/manual/de/class.datetime.php for docs
echo $endDate->format('u');

我想你看起来像这样吗?即使这样也可以,有没有办法把结果转换成毫秒。结果:
'18/04/2017 04:48 pm'
$yourArr => array(
    'month' => '05',
    'day' => '30',
    'year' => '2017',
    'hour' => '10',
    'min' => '48',
    'meridian' => 'pm'
)

$endDate = createEndDate($yourArr);
// see http://php.net/manual/de/class.datetime.php for docs
echo $endDate->format('u');