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