检查集合中的连续日期并返回范围

我有日期Ymd格式的数组,该格式可以是相隔一天的十个设置日期的任意组合。

例如:这是全套:

2011-01-01、2011-01-02、2011-01-03、2011-01-04、2011-01-05、2011-01-06、2011-01-07、2011-01-08、2011-

2011年1月9日至01日

从该集合创建的数组可以是日期的任何组合-所有日期,其中一个日期,一些连续日期,所有连续日期等。

我目前让他们退货时几乎打印。例如,这可能是结果:

2011-01-02

2011-01-03

2011-01-04

2011-01-08

(实际打印的内容更像是“ 1月2日,星期五……”,但我们将继续使用简单的日期字符串)

我想浓缩一下,这样如果连续三天或更多天,这些天就变成了范围,例如,上面的示例将变成:

2011-01-02至2011-01-04

2011-01-08

最终将变成:

1月2日,星期日-1月4日,星期二

1月8日,星期六

有没有办法遍历并检查时差,为范围创建开始时间和结束时间,然后收集散乱的人?

回答:

一个简单的答案,对于缺乏实现感到抱歉,但是假设您使用的是5.3,并且日期按时间顺序排列,则可以将每个日期转换为一个DateTime对象(如果尚未转换),然后使用DateTime::diff()生成该对象的数组进行迭代一个DateInterval可以用来将迭代中的当前日期与上一个日期进行比较的对象。您可以将连续的日期分组到子数组中,并使用shift()pop()获取该子数组中的第一天和最后几天。

我对此有所考虑。接下来的工作很粗略,很容易实现,但是应该可以:

// assuming a chronologically

// ordered array of DateTime objects

$dates = array(

new DateTime('2010-12-30'),

new DateTime('2011-01-01'),

new DateTime('2011-01-02'),

new DateTime('2011-01-03'),

new DateTime('2011-01-06'),

new DateTime('2011-01-07'),

new DateTime('2011-01-10'),

);

// process the array

$lastDate = null;

$ranges = array();

$currentRange = array();

foreach ($dates as $date) {

if (null === $lastDate) {

$currentRange[] = $date;

} else {

// get the DateInterval object

$interval = $date->diff($lastDate);

// DateInterval has properties for

// days, weeks. months etc. You should

// implement some more robust conditions here to

// make sure all you're not getting false matches

// for diffs like a month and a day, a year and

// a day and so on...

if ($interval->days === 1) {

// add this date to the current range

$currentRange[] = $date;

} else {

// store the old range and start anew

$ranges[] = $currentRange;

$currentRange = array($date);

}

}

// end of iteration...

// this date is now the last date

$lastDate = $date;

}

// messy...

$ranges[] = $currentRange;

// print dates

foreach ($ranges as $range) {

// there'll always be one array element, so

// shift that off and create a string from the date object

$startDate = array_shift($range);

$str = sprintf('%s', $startDate->format('D j M'));

// if there are still elements in $range

// then this is a range. pop off the last

// element, do the same as above and concatenate

if (count($range)) {

$endDate = array_pop($range);

$str .= sprintf(' to %s', $endDate->format('D j M'));

}

echo "<p>$str</p>";

}

输出:

Thu 30 Dec

Sat 1 Jan to Mon 3 Jan

Thu 6 Jan to Fri 7 Jan

Mon 10 Jan

以上是 检查集合中的连续日期并返回范围 的全部内容, 来源链接: utcz.com/qa/399920.html

回到顶部