2013-07-17 7 views
0

Мне нужно импортировать текстовые файлы из разных источников, которые будут содержать даты в различных форматах. Учитывая, насколько много запутанных фрагментов данных я обнаружил в тестовых файлах, которые я собрал до сих пор, я решил заставить пользователя ввести их формат даты перед импортом файла, например. MMDDYYYY или DD.MM.YYYY т.д.Преобразование формата пользовательских дат с использованием простого введенного пользователем формата

Я не могу ожидать, что эти пользователи понять достаточно ввести Y-m-d или n/j/Y форматы, которые были бы достаточно легко разобрать, и я не могу полагаться на «стандарты», как «если используется тире , затем месяц доходит до дня »и т. д., поэтому автоматический разбор очень сильно исключается.

Другая проблема с обычным форматированием даты PHP заключается в том, что я не могу предсказать, будет ли какой-либо формат даты иметь одну или две цифры, и я не знаю, как createFromFormat будет анализировать это, если я дам им одну цифру, если он ожидает двойную цифру ...

Итак, моя первая мысль заключается в том, чтобы отделить чистые числовые даты от других и заставить пользователя вводить полную 8-значную дату вместе с кодом формата - в противном случае она становится беспорядочной. Но это насколько я дошел до сих пор ...

Я думал о разборе даты и форматировании строки рядом, но это снова вызовет проблемы с одноразрядными номерами, если я не буду осторожен.

Я не нашел ничего, что поможет в моем случае, но, возможно, я беру это из-за неправильного угла - возможно, есть инструмент выбора формата даты Javascript или jQuery, который совместим с форматами даты PHP. ..

Любые предложения по наилучшему подходу для этого?

+0

Вы вынуждали пользователей вводить формат только с помощью DD MM YYYY и комбинаций разделителей? Или они могут решить, как вводится формат? – deacs

+0

Я могу выбрать все, что захочу - пока нет системы для ее обработки. Я просто подумал, что MMDDYYYY является самым широко известным. Но я не могу заставить пользователя узнать разницу между m и n и d и j для формата PHP ...С другой стороны, я только выяснил, что 'createFromFormat' действительно анализирует отдельные цифры правильно, когда он должен ожидать двойные цифры, поэтому я мог бы сам создать матрицу преобразования ... – semmelbroesel

+0

Почему они должны знать Форматы PHP? если вы решите, что они должны ввести свой формат с помощью MM DD YYYY, вы можете разделить части даты (из данных) на php и поместить их обратно вместе так, как вы хотите. потому что вы знаете, какая часть их данных - год, месяц и т. д. – deacs

ответ

0

JQuery UI имеет хорошую DatePicker, я использовал его в течение нескольких приложений, чтобы обеспечить формат даты всегда одинаково

+0

Проблема в том, что мне не нужно выбирать дату, но формат даты - фактические данные поступают из импортированных текстовых файлов. Мне нужно, чтобы этот выбор даты позволил мне выбрать формат даты, а затем выплюнуть строку формата даты php, в которой я нуждаюсь, например. "Y-м-д". – semmelbroesel

+0

jquery datepicker позволяет вам установить формат, который вы хотите использовать с помощью простого параметра – skrilled

+0

Я думаю, вы не понимаете мой вопрос ... Мне вообще не нужно вводить дату. Мне нужно, чтобы пользователь сказал свой код обработки PHP в каком формате будет дата в их файле. Если их файл содержит даты, похожие на 20131231, то мне нужно знать YYYYMMDD или Ymd в PHP, чтобы соответственно конвертировать их дату, поэтому пользователь должен был бы сообщить мне «YYYYMMDD» или «Ymd» - любой из которых трудно понять большинству наших пользователей. Таким образом, datepicker не поможет, если у datepicker нет пользовательского интерфейса для выбора форматов даты. – semmelbroesel

0

Я думаю, что я нашел самое простое решение. Я думал слишком сложно.

Я ограничить ввод формата даты до 2 цифр M, 2 цифры D и 4 цифры Y с любой или нет сепаратора, то можно использовать следующим образом:

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

Это должно работать для меня. Спасибо за ваши предложения! Если у кого-то есть лучшая идея, я все еще открыт :-)

0

Вместо того, чтобы позволить пользователю вводить формат даты, позвольте им выбрать предопределенный из раскрывающегося меню. Таким образом, вы избегаете совершенно безумного человека, который вводит «месяц-день -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; 
} 

Вам нужно будет найти способ конвертировать каждый формат даты, о котором вы можете думать. Так что это займет немного времени. Вы также можете предоставить пользователю возможность сообщать веб-мастеру о формате даты, отличной от списка. Затем получите эту опцию, чтобы отправить вам электронное письмо, чтобы вы могли добавить его в список.

+0

Я думал об этом, но есть слишком много возможных комбинаций ... Я установлю несколько «основных правил» с помощью JavaScript 'onsubmit', чтобы убедиться, что у нас есть пары и четыре, и это будет так. Спасибо за предложение, хотя! – semmelbroesel

+0

никаких проблем, надеюсь, что вы его отсортируете, может быть, кто-то сможет использовать мой ответ в будущем! –

+0

Это тоже была моя мысль :-) Не все могут иметь такие несогласованные данные, как то, с чем я столкнулся ;-) Теперь у меня должно получиться работать - мне просто нужно выполнить несколько проверок формата в JS, тогда я будь хорошим. – semmelbroesel

Смежные вопросы