【问题标题】:Parsing dates with inconsistent formats in PHP在 PHP 中解析格式不一致的日期
【发布时间】:2014-07-24 14:25:18
【问题描述】:

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

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

  • 7 月 26 日星期六
  • 7 月 28 日星期一至 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
}

【问题讨论】:

  • 如果您要获得非常不一致和非标准的格式,您将面临一项不可能完成的工作。您可以在 PHP 中使用任何格式的日期,但您必须知道能够做到这一点的格式。处理字符串的时候会知道格式吗?
  • 日期字符串来自多个地方 - 主要来自艺术和文化场所提供的 API,以及一些没有 API 可用的网络抓取。每个 API/网站都始终使用自己的格式 - 问题是数据来自许多不同的地方。
  • 但是每个地方都使用一致的格式?如果是这样,您可以肯定地处理这个问题。如果你确认我可以告诉你怎么做。
  • 是的,每个来源都是一致的:)

标签: php date time strtotime


【解决方案1】:

只要每个来源为您提供一致的格式,您就可以使用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 的工作留给您,因为您需要做更多的工作才能从第二个日期获取月份并将其应用于第一个日期。但这应该会告诉你如何去做。

【讨论】:

  • 太好了 - 谢谢约翰!看起来我可以很容易地将它用作 API / 网站抓取的一部分,以便在进入数据库之前一切都是一致的。猜测 strrchr("Monday 28 - Wednesday 30 July", " ") 的内容适用于仅提及一次月份的日期范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多