使用简单的用户输入格式转换自定义日期格式


Convert custom date format using a simple user-entered format

我需要从各种来源导入文本文件,这些文件将包含各种格式的日期。鉴于到目前为止我在收集的测试文件中遇到了多少混乱的数据,我决定强制用户在导入文件之前输入他们的日期格式,例如MMDDYYYYDD.MM.YYYY等。

我不能指望这些用户足够理解输入Y-m-dn/j/Y格式,这些格式很容易解析,我也不能依赖"如果使用破折号,那么月在日之前"等"标准",所以自动解析是不可能的。

通常的PHP日期格式的另一个问题是,我无法预测任何日期格式是单位数还是双位数,我也不知道如果createFromFormat在期望双位数时给它们一个单位数,它会如何解析。。。

因此,我的第一个想法是从将纯数字日期与其他日期分开开始,并强制用户输入一个完整的8位数日期和格式代码,否则会变得混乱。但这是我迄今为止所做的。。。

我考虑过将日期和格式字符串并排解析,但如果我不小心的话,这会再次导致一位数的问题。

我还没有发现任何对我的情况有帮助的东西,但也许我从错误的角度看待这个问题——也许有一个Javascript或jQuery日期格式选择工具与PHP日期格式兼容。。。

有什么关于最佳方法的建议吗?

jquery ui有一个很好的日期选择器,我在几个应用程序中使用过它,以确保日期的格式始终是相同的

我想我找到了最简单的解决方案。我想得太复杂了。

我会将日期格式输入限制为M的2位、D的2位和Y的4位,带任何或不带分隔符,然后我可以使用这个:

$str = '02-01-2013';
$format = "DD-MM-YYYY";
$matrix = array(
    "YYYY"=>"Y",
    "MM"=>"m",
    "DD"=>"d"
);
foreach ($matrix as $key=>$value)
{
    $format = str_replace($key, $value, $format);
}
$date = Datetime::createFromFormat($format, $str);
echo $date->format('Y-m-d');

这应该对我有用。谢谢你的建议!如果有人有更好的想法,我仍然开放:-)

与其让用户输入日期格式,不如让用户从下拉菜单中选择预定义的日期格式。这样一来,你就可以避免一个完全疯狂的人将"月日YYYY"作为一种格式或其他奇怪的东西输入,甚至只是拼写错误。一旦你有了一个格式列表,你就可以使用php-if语句将日期转换成你想要的任何完成格式。

$dateFormat = $_POST['dateFormat'];    
$date = $dateFromFile;
if ($dateFormat == "YYYYMMDD"){
   $cleanDate = DateTime::createFromFormat('Ymd', $date);
   echo $cleanDate->format('Y-m-d');
}
else if ($dateFormat == "YYYY/MM/DD"){
   $explodedDate = explode("/", $date);
   $year = $explodedDate[0];
   $month = $explodedDate[1];
   $day = $explodedDate[2];
   $cleanDate = "$year-$month-$day";
   echo $cleanDate;
} 
else if ($dateFormat == "Month DD, YYYY"){
    $explodedDate = explode(" ", $date);
    $month = $explodedDate[0]; 
            //change month from word into corresponding number
        if ($month == "January" || $month == "january" || $month == "Jan" || $month == "jan" || $month == "Jan." || $month == "jan."){
        $cleanMonth = "01";
        }
        else if ($month == "February" || $month == "february" || $month == "Feb" || $month == "feb" || $month == "Feb." || $month == "feb."){
        $cleanMonth = "02";
        }
        else if ($month == "March" || $month == "march" || $month == "Mar" || $month == "mar" || $month == "Mar." || $month == "mar."){
        $cleanMonth = "03";
        }
        else if ($month == "April" || $month == "april" || $month == "Apr" || $month == "apr" || $month == "Apr." || $month == "apr."){
        $cleanMonth = "04";
        }
        else if ($month == "May" || $month == "may" || $month == "May" || $month == "may" || $month == "May." || $month == "may."){
        $cleanMonth = "05";
        }
        else if ($month == "June" || $month == "june" || $month == "Jun" || $month == "jun" || $month == "Jun." || $month == "jun."){
        $cleanMonth = "06";
        }
        else if ($month == "July" || $month == "july" || $month == "Jul" || $month == "jul" || $month == "Jul." || $month == "jul."){
        $cleanMonth = "07";
        }
        else if ($month == "August" || $month == "august" || $month == "Aug" || $month == "aug" || $month == "Aug." || $month == "aug."){
        $cleanMonth = "08";
        }
        else if ($month == "September" || $month == "september" || $month == "Sep" || $month == "sep" || $month == "Sep." || $month == "sep."){
        $cleanMonth = "09";
        }
        else if ($month == "October" || $month == "october" || $month == "Oct" || $month == "oct" || $month == "Oct." || $month == "oct."){
        $cleanMonth = "10";
        }
        else if ($month == "November" || $month == "november" || $month == "Nov" || $month == "nov" || $month == "Nov." || $month == "nov."){
        $cleanMonth = "11";
        }
        else if ($month == "December" || $month == "december" || $month == "Dec" || $month == "dec" || $month == "Dec." || $month == "dec."){
        $cleanMonth = "12";
        }   
    $day = $explodedDate[1];
    $year = $explodedDate[2];
    $cleanDay = preg_replace("/[^0-9]/","",$day);//remove extra characters from day
    $cleanDate = "$year-$cleanMonth-$cleanDay";
    echo $cleanDate;
}

你必须想办法转换你能想到的每一种不同的日期格式。所以这需要一些时间。您还可以为用户提供通知网站管理员未列出日期格式的选项。然后选择向您发送电子邮件,这样您就可以将其添加到列表中。