处理日期可以采用两种格式之一

时间:2014-11-22 00:21:08

标签: php oracle10g

我有一个使用HTML5 input type="date"

的PHP应用程序
<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')

4 个答案:

答案 0 :(得分:2)

使用strtotimedate功能。

$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"

答案 1 :(得分: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
}

答案 2 :(得分: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;

答案 3 :(得分:0)

如果两种格式即模式是已知的 - 它很好。只需使用PHP来确定它的日期格式并将其解析为需要的日期格式:

<?php
function process_date($date)
{
  if (preg_match('/^((0[1-9]|[12][012345678]|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");
?>