当前位置: 首页 > 面试题库 >

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

慕容宏毅
2023-03-14
问题内容

我有日期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


 类似资料:
  • 问题内容: 如果我在表中有2个日期列,并且。如何返回给定日期介于这两个日期之间的行?例如: 如果给定的日期是 它应该返回以下行 来自以下各行: sql可能吗? 我正在使用sql server 2008。 问题答案: 使用SQL Server,它实际上非常简单:

  • 问题内容: 我有一个ID为,状态和员工日期范围的数据集。 下面给出的输入数据集是一名员工的详细信息。 记录中的日期范围是连续的(按确切顺序),因此第二行的开始日期将是第一行的结束日期的下一个日期。 如果员工连续休假不同的月份,则该表将存储日期范围不同的信息。 例如:在输入集中,员工已从‘16 -10-2016’休病假到‘31 -12-2016’,并在‘1-1-2017’重新加入。 因此,该项目有3

  • 问题内容: 我有一系列记录,其中包含一些具有时间有效性的信息(产品类型)。 如果分组信息(产品类型)保持不变,我想将相邻的有效期合并在一起。我不能与和一起使用简单的方法,因为某些产品类型(在示例中为)可以“消失”和“返回”。 使用Oracle 11g。 输入数据 : 预期结果 : 请参阅完整的SQL Fiddle。 问题答案: 这是一个孤岛问题。有多种方法可以解决此问题。这使用和分析功能: SQL

  • 问题内容: 我有一个表,每个月的每月(一年中的每个月)包含1条记录。我需要确定给定月份的站点是否至少有15个连续记录,并且我需要知道该连续天数的开始和结束日期。我可以在存储过程中执行此操作,但我希望可以在单个查询中完成此操作。我正在处理一个相当大的数据集,每月至少有3000万条记录。 结果示例: 感谢您的帮助! 问题答案: 这是有关如何执行此查询的示例: 然后查询: 结果: 问候,罗布。

  • 问题内容: 我有一个日期变量:如果所说的日期在TODAY的3天内,我想返回一个布尔值。我不太确定如何在Python中构造它。我只处理日期,不处理日期时间。 我的工作示例是“宽限期”。一个用户登录到我的网站,如果宽限期在今天的3天之内,则该用户将省略其他脚本等。 我知道您可以在Python的日期模块中做一些花哨/复杂的事情,但我不确定在哪里看。 问题答案: 在Python中检查范围,您可以使用:

  • 问题内容: 该表用于存储会话(事件): 我们不想在范围之间产生冲突。 假设我们需要在 2010-01-05 至 2010-01-25之间 插入一个新会话。 我们想知道有冲突的会话。 这是我的查询: 结果如下: 有没有更好的方法来做到这一点? 小提琴 问题答案: 我曾经用日历应用程序进行过这样的查询。我想我使用了这样的东西: 更新 这肯定应该工作((ns,ne,es,ee)=(new_start,n