为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
芜湖不芜 2022-01-02 14:41:16
我有一个巨大的 excel 文件,我正在导入并存储到日期字段(日期(“Ymd”))。问题是,输入有几种不同的格式,例如:1) 2015/01/01 // valid format, php converts this to yyyy-mm-dd2) 2015-01 // supposed to be 2015-01-013) jan/18 // supposed to be 2018-01-01如您所见,虽然大多数以有效格式提供,但(大部分)使用了另外两种格式,即“年-月”和“月/年”。一切都表示 strtotime,下面应该工作 - 但是我将如何表示当月的“第一天”没有提供日期(因为否则它最终会为除(1)之外的所有内容都为空,如果我的理解是正确的)?//assumes $str is one of the above mentioned formatsif (($timestamp = strtotime($str)) === false) {    $date = null;} else {    $date = date('Y-m-d', $timestamp);}
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您可以根据输入日期字符串的长度创建格式函数。


$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 附加到格式函数中的字符串以将日期设置为该月的第一天。


查看完整回答
反对 回复 2022-01-02
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

您可以创建一个与此类似的脚本并多次运行它并对其进行调整,直到获得所有日期格式。


// 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 


查看完整回答
反对 回复 2022-01-02
  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信