【问题标题】:Create a new date from php array从 php 数组创建一个新日期
【发布时间】:2017-04-18 15:09:44
【问题描述】:

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

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

【问题讨论】:

标签: php date datetime


【解决方案1】:

我使用DateTime::createFromFormatvsprintf 从数组中构造了一个时间字符串,结果如下:

<?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');

输出(您可以调整格式:

30/05/2017 10:48 pm

实际上你可能甚至不需要使用DateTime,但我建议你这样做,然后可以进一步操作它(添加时间间隔或更改格式),你可能只是这样做:

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

演示:https://eval.in/778600

【讨论】:

  • 有没有办法将结果转换为毫秒。结果:'18/04/2017 04:48 pm'
【解决方案2】:

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

$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']}");

【讨论】:

    【解决方案3】:

    没有 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');
    

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 2013-08-21
      • 2020-09-21
      • 2012-12-16
      相关资源
      最近更新 更多