将持续数天的 NSDate 拆分为几个跨度

Posted

技术标签:

【中文标题】将持续数天的 NSDate 拆分为几个跨度【英文标题】:Split NSDate that stretches over several days into several spans 【发布时间】:2015-03-28 15:14:30 【问题描述】:

我有 2 个定义跨度的 NSDates,可以这样设置它们

spanA: 12:00 today
spanB: 12:00 tomorrow

这等于 24 小时,但我需要创建两个范围而不是一个,这样跨度就不会延伸到午夜。上面示例的结果如下所示:

spanA: 12:00 today
spanB: 23:59 today

spanC: 00:01 tomorrow
spanD: 12:00 tomorrow

我不知道该怎么做。我想出了一个使用这样的函数的想法:

- (NSInteger)daysBetweenDate:(NSDate *)fromDateTime andDate:(NSDate *)toDateTime

NSDate *fromDate;
NSDate *toDate;

NSCalendar *calendar = [NSCalendar currentCalendar];

[calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate
             interval:NULL forDate:fromDateTime];
[calendar rangeOfUnit:NSCalendarUnitDay startDate:&toDate
             interval:NULL forDate:toDateTime];

NSDateComponents *difference = [calendar components:NSCalendarUnitDay
                                           fromDate:fromDate toDate:toDate options:0];

return [difference day];

它返回跨度跨越的天数,或者换句话说:所需的跨度数。然后我可以例如循环循环天数并添加一些逻辑来创建必要的跨度。

我将其用作跨度的结构:

typedef struct

NSTimeInterval start;
NSTimeInterval end;
 span;

最好的方法是什么?

【问题讨论】:

【参考方案1】:

由于除了可能的第一个和最后一个跨度之外的所有跨度都是相同的全天跨度,您可以使用此算法:

检查初始时间是否为午夜。如果不是午夜,则添加从当天开始到午夜的开盘跨度 对于第一个午夜之后的每一天,将一整天的范围添加到第二天的午夜 检查最后一次是否是午夜。如果不是午夜,则在结果中添加一个结束跨度。

【讨论】:

您可以使用这个 (github.com/abdullah-chhatra/iDate) 框架让您轻松实现这个算法。 也想到了,目前正在实施

以上是关于将持续数天的 NSDate 拆分为几个跨度的主要内容,如果未能解决你的问题,请参考以下文章

将字符串列拆分为几个虚拟变量

Vue 项目中对路由文件进行拆分(解构的方法)

根据多个条件将一列拆分为几列并分组

如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?

R中根据特定字符将一列拆分为几列的方法

sql如何把行拆分为几行