在PHP中解析格式不一致的日期

时间:2014-07-24 14:25:18

标签: php date time strtotime

我有两个查询,都与日期有关。

1)我有这些格式的日期,我希望在保存到数据库之前将其标准化为相同的格式:

  • 7月26日星期六
  • 7月28日星期一至7月30日星期三
  • 2014年7月24日
  • 9月4日星期四
  • 8月28日星期四 - 9月19日星期五
  • 24-07-2014

使用strtotime()很容易解决单日,但日期范围有点棘手。

例如,这不起作用:

$dateString = "Monday 28 - Wednesday 30 July";

if (strpos($dateString, "-")) {
    $datePieces = explode("-", $dateString);
    $startDate = strtotime($datePieces[0]);
    $endDate = strtotime($datePieces[1]);
} else {
    $startDate = strtotime($dateString);
    $endDate = strtotime($dateString);
}

echo '<pre>';
echo date('d F Y', $startDate);
echo '<br/>';
echo date('d F Y', $endDate);

因为月份仅在explode()的一侧,所以这样做会返回:

01 January 1970
30 July 2014

2)我需要一种方法来确定日期是哪一年(将来会是这样)。有点像:

if (the month in the date string has elapsed) {
    the year of the date is this year + 1
}

1 个答案:

答案 0 :(得分:3)

只要每个来源为您提供一致的格式,您就可以使用DateTime()DateTime::createFromFormat()为您处理日期。

//Saturday 26 July
$date = DateTime::createFromFormat('l j F', 'Saturday 26 July');

//July 24th, 2014
$date = new DateTime('July 24th, 2014');

//Thu 4 Sep
$date = DateTime::createFromFormat('D j M', 'Thu 4 Sep');

//Thu 28 Aug — Fri 19 Sep
list($start, $end) = explode(' - ', 'Thu 28 Aug — Fri 19 Sep');
$start = DateTime::createFromFormat('D j M', $start);
$end   = DateTime::createFromFormat('D j M', $end);

//24-07-2014
$date = new DateTime('24-07-2014');

我将离开处理Monday 28 - Wednesday 30 July给你,因为你需要做更多的工作来从第二个日期获得月份并将其应用到第一个月。但这应该告诉你如何解决这个问题。

相关问题