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

时间:2016-01-17 00:06:17

标签: php datetime

我有一个问题。 API的日期在2016年2月4日回复给我。我必须应用一些日期修改,我需要的日期格式为02-04-2016。该代码适用于从9返回的API返回的日期,例如2016年2月10日,因为当我操纵它时,我得到它整齐地在02-10-2016。然而,问题是日期低于10,例如2016年2月4日,因为这些导致02-4-2016导致错误。

我想知道的是我如何能够始终如一地获得02-04-2016的格式,无论API的日期是9还是9以下。以下是我的代码。

// 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");

6 个答案:

答案 0 :(得分:1)

要在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));

这会产生输出:

Feb 04 2016
Feb 01 2016

答案 1 :(得分:0)

你可以简单地让PHP一次完成所有工作:

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

答案 2 :(得分:0)

尝试直接使用函数strtotime

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

答案 3 :(得分:0)

我设法想到了一个解决方案。可能不太理想,但它确实有效。

基本上,问题是我需要在之前添加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");

答案 4 :(得分:0)

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

echo (new DateTime('Feb 4 2016'))->format('m-d-Y');

答案 5 :(得分:0)

您应该使用DateTime::createFromFormat方法,接受月份,不带前导零,三个月字母,以及介于两者之间的空格,方法是使用F j 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);