Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解析日期字符串_Php_Mysql_String_Parsing_Datetime - Fatal编程技术网

Php 解析日期字符串

Php 解析日期字符串,php,mysql,string,parsing,datetime,Php,Mysql,String,Parsing,Datetime,我在post变量中有这个字符串 '03/21/2011' 我需要通过php解析它,并将其转换为这种格式 '2011-03-21' 我正在使用php,我需要这种格式,这样我就可以运行这个查询 SELECT prospect as 'Prospect', company as 'Company', industry as 'Industry', created_at as 'Original Date Submitted', software as 'Software', warm_transf

我在post变量中有这个字符串

'03/21/2011'
我需要通过php解析它,并将其转换为这种格式

'2011-03-21'
我正在使用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'

如果您想在PHP中处理它,最好的方法是使用函数,该函数将字符串转换为时间,然后可以使用该函数进行操作

所以你会做一些类似的事情:

$dateStr = date('Y-m-d', strtotime('03/21/2011'));
使用
strotime()
的好处在于,您不必担心传入的字符串的确切格式。只要它是半合理的,它就会转换它


因此,它将处理2011年3月21日2011年3月21日03-21-11,而无需任何修改或特殊情况。

您甚至可以从mysql解析它

$items=explode('/','03/21/2011');
$time=mktime(0,0,0,$items[0],$items[1],$items[2]);
$isodate=date('Y-m-d',$time);
select str_to_date('03/21/2011','%m/%d/%Y')
STR_TO_DATE(创建于,'%m/%d/%Y')作为“原始提交日期”

$date = '03/21/2011';
$timestamp = strtotime($date);
$sqlDate = date('Y-m-d', $timestamp);
这应该能满足你的需要


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

$date = date_create_from_format('n/d/Y', $date)->format('Y-n-d');
它是明确的,您永远不必怀疑m/d或d/m等。

您可以在这里看到它

或者使用PHP 5.3的日期类回答1:

你可以用这样的东西

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

这对代码的可读性不是很好,因为它不允许您显式地解析某个格式并在代码中显示出来。例如,对于外部程序员来说,您的代码对于$someDate的格式并不明显,因为strotime解析多种格式

专业的

但是,如果$someDate可能会更改,并且您希望代码继续尝试规范化各种格式,那么这是一个很好的选择

骗局

如果需要,则数据的格式不受支持。例如,当试图解析非美国日期格式的日期时,意味着月份和日期被切换,但格式使用正斜杠(21/04/78),通过查看各个组件之间的分隔符,可以消除m/d/y或d-m-y格式中日期的歧义:如果分隔符是斜杠(/),则假定为美国m/d/y;而如果分隔符是破折号(-)或点(.),则假定为欧洲d-m-y格式

答复2:

为了让您的代码清楚地知道解析的日期,并验证输入的数据是否使用了正确的格式,我将使用date\u create\u from\u格式。以下是一些帮助代码:

$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);
此链接将更详细地解释此示例:


可能重复的,您可以找到一对解决此问题的解决方案。但是,请注意,它无法解析d/m/Y,这是一种非常合理的格式。从strotime文档来看,它似乎假设m/d/Y if/用作分隔符,而d-m-Y if-or。用作分隔符。听起来不错。当然,这意味着它实际上无法解析
3-21-2011
。这就是为什么我更喜欢
date\u create\u from\u format
(因为如果您要求它解析这样一种格式,它可以解析),但显然,当
d时,没有任何东西可以捕捉(例如)意外的
d-m-Y