猿问

PHP - 接受输入和输出日期的各种日期格式

我有一个巨大的 excel 文件,我正在导入并存储到日期字段(日期(“Ymd”))。问题是,输入有几种不同的格式,例如:


1) 2015/01/01 // valid format, php converts this to yyyy-mm-dd

2) 2015-01 // supposed to be 2015-01-01

3) jan/18 // supposed to be 2018-01-01

如您所见,虽然大多数以有效格式提供,但(大部分)使用了另外两种格式,即“年-月”和“月/年”。一切都表示 strtotime,下面应该工作 - 但是我将如何表示当月的“第一天”没有提供日期(因为否则它最终会为除(1)之外的所有内容都为空,如果我的理解是正确的)?


//assumes $str is one of the above mentioned formats

if (($timestamp = strtotime($str)) === false) {

    $date = null;

} else {

    $date = date('Y-m-d', $timestamp);

}


芜湖不芜
浏览 140回答 2
2回答

繁花不似锦

您可以根据输入日期字符串的长度创建格式函数。$formats = [    10 => function($string) { return date_create_from_format('Y/m/d', $string); },    7 => function($string) { return date_create_from_format('Y-m j', $string . ' 1'); },    6 => function($string) { return date_create_from_format('M/y j', $string . ' 1'); }];然后使用这些函数创建您的日期$date = $formats[strlen($a_date_string)]($a_date_string);我将 1 附加到格式函数中的字符串以将日期设置为该月的第一天。

阿波罗的战车

您可以创建一个与此类似的脚本并多次运行它并对其进行调整,直到获得所有日期格式。// should be listed from more specific to least specific date format$dateFormats = [    'Y/m/d' => ['midnight'],    'Y-m'   => ['midnight', 'first day of this month'],    'M/y'   => ['midnight', 'first day of this month'],];$dates = [    '2015/01/01',    '2015-01',    'jan/18',];foreach ($dates as $date) {    if ($dateTime = getDateTimeFrom($date, $dateFormats)) {        echo "{$dateTime->format('Y-m-d H:i:s')} \n";    } else {        echo "Unknown date format : {$date} \n";    }}function getDateTimeFrom(string $dateString, array $dateFormats) : ?\DateTime {    if (!$dateString) {        return null;    }    foreach ($dateFormats as $format => $modifiers) {        if ($dateTime = \DateTime::createFromFormat($format, $dateString)) {            foreach ($modifiers as $modification) {                $dateTime->modify($modification);            }            return $dateTime;        }    }    return null;}// Outputs:// 2015-01-01 00:00:00 // 2015-01-01 00:00:00 // 2018-01-01 00:00:00 
随时随地看视频慕课网APP
我要回答