如何从外部源PHP修复日期不一致

如何从外部源PHP修复日期不一致,php,datetime,Php,Datetime,我有个问题。API的日期是2016年2月4日。我必须应用一些日期修改,我需要格式为02-04-2016的日期。该代码对于API返回的大于9的日期(如2016年2月10日)运行良好,因为当我处理该日期时,我将其准确地表示为2016年2月10日。但是,问题在于日期低于10,例如2016年2月4日,因为这些日期导致2016年2月4日,这会导致错误 我想知道的是,无论API的日期高于9或低于10,我如何能够始终获得2016年4月2日的格式。下面是我的代码 // Split checkin date s

我有个问题。API的日期是2016年2月4日。我必须应用一些日期修改,我需要格式为02-04-2016的日期。该代码对于API返回的大于9的日期(如2016年2月10日)运行良好,因为当我处理该日期时,我将其准确地表示为2016年2月10日。但是,问题在于日期低于10,例如2016年2月4日,因为这些日期导致2016年2月4日,这会导致错误

我想知道的是,无论API的日期高于9或低于10,我如何能够始终获得2016年4月2日的格式。下面是我的代码

// Split checkin  date string from API
list($month, $day, $year, $time) = explode(' ', $checkindate); 

// change short month name (e.g Feb) to month number (e.g. 02)
$monthname = $month;
$month = date('m', strtotime($monthname));

// new checkin date in example format 02-20-2016
 $checkin_new = $month.'/'.$day.'/'.$year; // this is the part that causes an error when date returned by API is below 10, for example Feb 4 2016. Other dates above 9 such as Feb 10 2016 work well and don't cause an issue.


// Subtract days
 $newdate = new DateTime($checkin_new ); 
 $subtracteddate = $newdate->modify("-1 day");

mYou可以简单地要求PHP一次完成所有工作:

$formatted_date = date('m-d-Y', strtotime($chekindate));

尝试直接使用函数
strotime

echo date('m-d-Y', strtotime('Feb 4 2016'));

我设法想出了一个解决办法。可能不太理想,但确实有效

基本上,问题是我需要在之前添加一个0,例如4,当一天低于10时。9天以上的工作已经很好了。因此,我编写了一个简单的if语句,并将其连接到代码中。更新部分以粗体显示

// Split checkin  date string from API
list($month, $day, $year, $time) = explode(' ', $checkindate); 

// if day is below 9, give var patchday value 0. Otherwise leave it empty
**if ($day < 10) { $patchday = "0"; } else { $patchday = ""; };**

// change short month name (e.g Feb) to month number (e.g. 02)
$monthname = $month;
$month = date('m', strtotime($monthname));

// new checkin date in example format 02-20-2016
 $checkin_new = $month.'/'.**$patchday**.$day.'/'.$year;

// Subtract days
 $newdate = new DateTime($checkin_new ); 
 $subtracteddate = $newdate->modify("-1 day");
//从API拆分签入日期字符串
列表($month,$day,$year,$time)=爆炸(“”,$checkindate);
//如果日期低于9,则为var patchday值0。否则,请将其留空
**如果($day<10){$patchday=“0”}其他{$patchday=“”;}**
//将短月份名称(如2月)更改为月份编号(如02)
$monthname=$month;
$month=日期('m',标准时间($monthname));
//示例格式02-20-2016中的新签入日期
$checkin_new=$month.'/'.*$patchday**.$day.'/'.$year;
//减去天数
$newdate=newdatetime($checkin\u new);
$subtracteddate=$newdate->modify(“-1天”);

使用可以接受多种格式的DateTime对象

echo (new DateTime('Feb 4 2016'))->format('m-d-Y');
您应该使用不带前导零的月份、三个字母的月份以及中间的空格的方法,使用
F j Y
如下所示

$date = DateTime::createFromFormat('F j Y', $checkindate);
$formatteddate = $date->format('m-d-Y');
然后格式化它,像这样

$date = DateTime::createFromFormat('F j Y', $checkindate);
$formatteddate = $date->format('m-d-Y');
如果时间也是从API返回的,那么您只需要将它以正确的格式(您可以在文档页面上找到)添加到
createFromFormat
字符串中,例如
H:i:s

$date = DateTime::createFromFormat('F j Y H:i:s', $checkindate);

要获取2月份的日期,请使用
mktime
功能:

echo date("M d Y ", mktime( 0,0,0,2, 4, 2016));
echo "<br />";
echo gmdate("M d Y ", mktime( 0,0,0,2, 2, 2016));

谢谢你的评论。我尝试过你的解决方案,但日期是1969年12月31日。@这对我来说很好(证明:试试
echo date('m-d-Y',strotime('2016年2月4日');
)。所以你会检查你的代码> $CUCKATEATION 内容。这是如何回答这个问题的?嗨,穆什,如果这个或任何答案已经解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。