2014-11-22 1 views
0

У меня есть приложение PHP, который использует HTML5 input type="date":дата Процесса, который может быть в одном из двух форматов

<input type="date" name="document_dt" id="document_dt" min="1899-12-30" max="2014-11-21" placeholder="mm/dd/yyyy" value="" maxlength="10" class="date"> 

Когда система доступна через современные браузеры этого элемент ввода дает дату в формате YYYY-MM-DD.

Старые браузеры не поддерживают HTML5 и обрабатывают это поле даты как обычное поле ввода. В таких случаях по старым причинам, вне моего контроля, ожидаемый формат равен DD-MON-YYYY (т.е.: «28-FEB-2014»).

Как я могу использовать Oracle или PHP для объединения этих форматов в «YYYY-MM-DD», так что этот фрагмент будет работать: TO_DATE(document_dt, 'yyyy-mm-dd')?

ответ

2

Используйте функции strtotime и date.

$date1 = date('Y-m-d', strtotime('28-FEB-2014')); 
$date2 = date('Y-m-d', strtotime('2014-05-28')); 
var_dump($date1, $date2); 

string(10) "2014-02-28" 
string(10) "2014-05-28" 
+0

Итак, функция strtotime() PHP выполняет некоторую интроспекцию на входящей строке? –

+1

['strtotime'] (http://php.net/manual/en/function.strtotime.php) делает,' date' просто позволяет вам отформатировать его так, как вы хотите. – slapyo

+0

Eh. Забыл об этом) – RussianVodka

0

Вы можете использовать регулярное выражение для проверки формата, а затем \DateTime::createFromFormat сделать преобразование в зависимости от того, какой строки у вас есть.

$date = false; 
$dateString = '28-FEB-2014'; 

if (preg_match('/^[0-9]{2}-[A-Z]{3}-[0-9]{4}$/i', $dateString)) { 
    $date = \DateTime::createFromFormat('j-M-Y', $dateString); 
} elseif (preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $dateString)) { 
    $date = \DateTime::createFromFormat('Y-m-d', $dateString); 
} 

if ($date) { 
    // do something with date 
} else { 
    // invalid date 
} 
0

Это соответствующая часть решения я работал в Oracle:

IF document_dt IS NOT NULL THEN 
     BEGIN 
      v_document_dt:=TO_DATE(document_dt, 'yyyy-mm-dd'); 
     EXCEPTION 
      WHEN OTHERS THEN 
       v_document_dt:=TO_DATE(document_dt, 'dd-mon-yyyy'); 
     END; 
    ELSE 
     v_document_dt:=SYSDATE; 
    END IF; 
0

Если два форматирует то есть модели известны из них - своего хорошего. Просто используйте PHP, чтобы определить, какой формат даты он использует, и проанализируйте его следующим образом:

<?php 
function process_date($date) 
{ 
    if (preg_match('/^((0[1-9]|[12][]|19)-(0[1-9]|1[012])|29-(0[13-9]|1[012])|30-(0[13-9]|1[012])|31-(0[13578]|1[02]))-(19|20)\d\d|29-02-(19|20)([02468][048]|[13579][26])$/', $date) === 1) 
    { 
    $d = explode("-", $date); 
    $date = $d[2]."-".$d[1]."-".$d[0]; 
    } 
    return $date; 
} 

echo process_date("2011-12-13")."<br>"; 
echo process_date("28-11-2014"); 
?>