解析日期字符串

问题描述:

我有这个字符串变量后解析日期字符串

'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

,最好的办法是使用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 Matthew 2011-03-23 18:23:40

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

你甚至可以从MySQL

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

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

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

这应该做你所需要的。

strtotime

date

虽然有很多方法可以做到这一点,我认为最容易理解和适用于所有日期的转换是:

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

这是明确的和你”我不会想知道m/d或d/m等。

你可以在这里看到它

http://www.codegod.de/WebAppCodeGod/PHP-convert-string-to-date--AID597.aspx

或使用日期类PHP 5.3的

答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