2011-03-23 67 views
0

我已經遇到這個在我公司的代碼庫,我想改變它的東西,不連接到MySQL僅僅只是一個函數:PHP版本()

$sql = "select date_format(str_to_date('$date','$format'),'%Y-%m-%d') startDate "; 
$result = mysql_query($sql); 
... 

我們的產品env是unix系列,和我的開發環境一樣,但有些人在windows環境下編寫代碼,所以strptime()不是一個選項。

我已經看到了類似的問題,圍繞SO浮動,但沒有一個答案符合我的需求。有沒有一種簡單的或常用的方法來從字符串中使用可變格式提取日期?

的日期格式可以差別如此之大的原因是因爲我們正在分析從供應商的文件名,所以我們必須能夠處理年月日,月日年,DDMMYYYY,ddmonyyyy,等等,等等

+0

排序的副本的http://stackoverflow.com/questions/2891937/strtotime-doesnt-work-with-dd-mm- yyyy-format – Brad 2011-03-23 16:40:01

回答

1

對其進行測試(無需編寫測試腳本)簡短的答案是,有沒有辦法自動解析任意日期格式,將正確解析所有格式在那裏。在你自己的示例格式中,沒有辦法知道哪些數字是用於哪個日期增量。

您可以查看strtotime()的可接受格式,如果您的所有供應商都使用其認可的格式,那麼您很幸運。但如果不是,最好的,你可以真正做的是創造的"vendor" => "format"查找表,然後你可以使用date_parse_from_format()

編輯: *基於下面的評論,這裏是date_parse_from_format的近似值的PHP4()版本應該滿足您的需求*

function date_parse_from_format($format, $date) { 
    $dMask = array('H'=>'hour','i'=>'minute','s'=>'second','y'=>'year','m'=>'month','d'=>'day'); 
    $format = preg_split('//', $format, -1, PREG_SPLIT_NO_EMPTY); 
    $date = preg_split('//', $date, -1, PREG_SPLIT_NO_EMPTY); 
    foreach ($date as $k => $v) { 
    if ($dMask[$format[$k]]) $dt[$dMask[$format[$k]]] .= $v; 
    } 
    return $dt; 
} 

基本上你需要有vendor => format查找表,其中的格式是什麼樣的日期字符串每個字符代表一個面具。

注意:用於每個日期/時間增量的掩碼並不完全反映php的正常date()字符串格式中使用的掩碼。它被簡化並且意味着掩蓋您的自定義字符串的每個單獨的字符。

實施例:

/* 
    lookup table for vendors 
    for EVERY character you want to count as a date/time 
    increment you must use the following masks: 
    hour : H 
    minute : i 
    second : s 
    year : y 
    month : m 
    day : d 
*/ 
$vendorDateFormats = array(
    'vendor1' => 'yyyymmdd', 
    'vendor2' => 'mmddyyyy', 
    'vendor3' => 'ddmmyyyy', 
    'vendor4' => 'yyyy.mm.dd HH:ii:ss' 
); 

// example 1: 
echo "<pre>"; 
print_r(date_parse_from_format($vendorDateFormats['vendor2'],'03232011')); 

// example 2: 
echo "<pre>"; 
print_r(date_parse_from_format($vendorDateFormats['vendor4'],'2011.03.23 12:03:00')); 

輸出:

Array 
(
    [month] => 03 
    [day] => 23 
    [year] => 2011 
) 

Array 
(
    [year] => 2011 
    [month] => 03 
    [day] => 23 
    [hour] => 12 
    [minute] => 03 
    [second] => 00 
) 
+0

不幸的是,我們沒有使用5.3,但是date_parse_from_format()恰恰是我正在尋找的函數的類型。謝謝。 http://us2.php.net/manual/en/datetime.createfromformat.php也鏈接到你發給我的鏈接上,如果我有一個更新的PHP版本,這會很有幫助。 – 2011-03-23 15:13:35

+0

啊那很爛。好的,看看編輯上面的php4版本,它應該適合你 – 2011-03-23 16:28:56

+0

非常聰明。再次感謝。 – 2011-03-23 16:56:15

1

有PHP函數strtotime()PHP Ref將大部分字符串轉換成時間戳(包括像「下個星期四」之類的東西),但即使在處理歐洲和美國的日期結構(「dd/mm/yyyy」與「毫米/日/年「)。

您可以在http://www.functions-online.com/strtotime.html

+0

歐洲/美國的日期結構正是我爲什麼不能使用strtotime()的原因。例如,12112011是什麼日期。 – 2011-03-23 15:11:37

+0

然後,我想你是堅持創建自己的函數來分割字符串,分析它來確定格式(或應用已知格式),將其改造成可預測的格式,然後解析它。另外,爲了檢查,你知道如果用斜線和美式分隔,如果用斜線分隔,strtotime()將採用歐洲標準?不要認爲這是否有助於解決您的問題。 – 2011-03-23 15:27:12

+0

噢,解析像「12112011」這樣的塊實際上並不是可以通過編程方式解決的東西(除非有關於預期值的規則,然後您可以測試每個可能的值)。這實際上是你需要在事物的輸入端修復(強制輸入爲指定格式)的東西。 – 2011-03-23 15:28:47