0

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

我不能指望这些用户理解到足以输入Y-m-dn/j/Y易于解析的格式,而且我不能依赖“标准”,例如“如果使用破折号,那么一个月前一天”等,所以自动解析是非常不可能的。

通常的 PHP 日期格式的另一个问题是,我无法预测任何日期格式是否会有一位数或两位数,而且我不知道createFromFormat如果我给他们一个位数,而它期望两位数时如何解析它...

所以我的第一个想法是首先将纯数字日期与其他日期分开,并强制用户输入完整的 8 位日期以及格式代码 - 否则会变得混乱。但这就是我到目前为止所获得的...

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

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

关于此最佳方法的任何建议?

4

3 回答 3

0

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

我将日期格式输入限制为 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');

这应该对我有用。感谢您的建议!如果有人有更好的主意,我仍然开放:-)

于 2013-07-17T19:28:57.663 回答
0

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

于 2013-07-17T19:09:24.390 回答
0

与其让用户输入日期格式,不如让他们从下拉菜单中选择一个预定义的格式。这样你就可以避免一个完全疯狂的人输入“month day-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;
}

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

于 2013-07-17T19:47:45.087 回答