2011-03-23 286 views
2

我有這個字符串變量後解析日期字符串

'03/21/2011' 

我需要通過PHP解析它,把它變成這種格式

'2011-03-21' 

我使用PHP和我需要這個格式,所以如果你想處理在PHP我可以運行此查詢

SELECT prospect as 'Prospect', company as 'Company', industry as 'Industry', created_at as 'Original Date Submitted', software as 'Software', warm_transfer as 'Warm Transfer', UserName as 'Sales Rep' FROM mercury_leads join user on UserID=user_id WHERE created_at BETWEEN '2011-01-01' AND '2011-03-22' 
+0

的可能重複的[的strtotime失敗上MM-DD-YYYY HH:MM] (http://stackoverflow.com/questions/5133703/strtotime-failing-on-mm-dd-yyyy-hhmm) – Gordon 2011-03-23 17:55:29

+0

,你可以通過使用搜索功能找到一對[其他重複] [http:// stackoverflow .com/search?q = format + date + [php]) – Gordon 2011-03-23 17:56:25

回答

3

,最好的辦法是使用strtotime() functi在其上將字符串轉換爲可以用date()函數處理的時間。

所以,你會做這樣的事情:

$dateStr = date('Y-m-d', strtotime('03/21/2011')); 

有關使用strtotime()的好處是,你不必擔心你在傳遞字符串的確切格式,只要它的東西。半合理的,它會轉換它。

因此,這將處理2011年3月21日2011年3月21日11年3月21日沒有任何修改或特殊情況。

+1

解決方案對此問題非常有用。但是,要注意的是它不能解析d/m/Y這是一個非常合理的格式。 – Matthew 2011-03-23 17:57:28

+1

從strtotime文檔看來,如果/被用作分隔符,則它看起來像是假設m/d/y;如果是 - 或者,則是d-m-y。被用作分離器。 – 2011-03-23 18:17:36

+1

聽起來正確。當然,這意味着它不能真正解析'3-21-2011'。這就是爲什麼我更喜歡'date_create_from_format'(因爲它可以解析這樣的格式,如果你問的話),但是當d <= 12時,顯然沒有什麼東西能夠捕捉到(例如)偶然的'd-m-Y'。就個人而言,我發現'strtotime'更有助於解析像「上週一」這樣的短語。 – Matthew 2011-03-23 18:23:40

1
$items=explode('/','03/21/2011'); 
$time=mktime(0,0,0,$items[0],$items[1],$items[2]); 
$isodate=date('Y-m-d',$time); 
1

你甚至可以從MySQL

select str_to_date('03/21/2011','%m/%d/%Y') 
0

STR_TO_DATE(created_at, '%M /%d /%Y')作爲 '提交原始日期' 解析它。

1
$date = '03/21/2011'; 
$timestamp = strtotime($date); 
$sqlDate = date('Y-m-d', $timestamp); 

這應該做你所需要的。

strtotime

date

1

雖然有很多方法可以做到這一點,我認爲最容易理解和適用於所有日期的轉換是:

$date = date_create_from_format('n/d/Y', $date)->format('Y-n-d'); 

這是明確的和你」我不會想知道m/d或d/m等。

0

答1:

您可以使用類似這樣

$dateStr = date('Y-m-d', strtotime($someDate)); 

精讀

這不是偉大的代碼可讀性,因爲它不允許你明確地解析某種格式並製作該obvio我們在代碼中。例如,由於strtotime分析多種格式,因此您的代碼對於外部程序員而言並不明顯,因爲$ someDate使用了什麼格式。

但是,如果$ someDate如有更改,並且希望代碼繼續嘗試標準化各種格式,這是一個不錯的選擇

精讀

如果您的數據來自於不支持的格式。例如,當試圖以非美國日期格式解析日期時,意味着切換月份和日期,但格式使用正斜槓(21/04/78)通過查看m/d/y或dmy格式的日期可以消除歧義在各個組件之間的分隔符處:如果分隔符是斜線(/),則假定美國m/d/y;而如果分隔符是破折號( - )或點(。),則假定歐洲的d-m-y格式。

答2:

要真正使你的代碼清楚哪個和你約會的解析和驗證未來的數據使用正確的格式,我會用date_create_from_format。下面是一些代碼,以幫助:

$server_date_str='06-10-2013 16:00:09'; 

$server_date_time = DateTime::createFromFormat('d-m-Y H:i:s',$server_date_str); 

// check the format 

if (!($server_date_time instanceof DateTime)) { 

    $error_array = DateTime::getLastErrors(); 

    throw new Exception(implode(" - ",$error_array['errors'])); 

} 

//convert DateTime object to Unix time stamp 

$server_time = strtotime($server_date_time->format('d-m-Y H:i:s')); 

//convert Unix timestamp to date string of the format 2012-10-21 
$dateStr = date('Y-m-d', $server_time); 

該實施例進行更完整細節在此鏈接解釋:

http://boulderapps.co/parse-a-date-by-a-specific-date-format-in-php