【问题标题】:How can I generate every date between two dates to a given granularity?如何以给定的粒度生成两个日期之间的每个日期?
【发布时间】:2019-01-16 21:15:58
【问题描述】:

如何以给定的粒度生成两个日期之间的每个日期?

我想让这个扩展垫成为一个日期数组,它们都必须在 00m、15m、30m 或 45m 处,这样就不会有间隙。 (可选)设置不在原始集合中的开始日期和结束日期(因此您可以有前导日期和尾随日期)。

extension TimeSeries {
    var earliest: Date? {
        return timeSeries.map { $0.date }.min()
    }
    var latest: Date? {
        return timeSeries.map { $0.date }.max()

    }
    func pad (to repletion: Int, _ component: Calendar.Component, from: Date? = nil, to: Date? = nil) {
        guard let start = from ?? self.earliest else {
            print("no start date given and none available")
            return
        }
        guard let end = to ?? self.latest else {
            print("no end date given and none available")
            return
        }

        // magic happens here...
    }
}

具体来说,给定:

[ Date/* 2018-01-16 01:15:00 */, Date/* 2018-01-16 01:45:00 */]

我希望数组变成:

[ Date/* 2018-01-16 01:15:00 */,  Date/* 2018-01-16 01:30:00 */, Date/* 2018-01-16 01:45:00 */]

如果它被称为ts.pad(to: 15, .minutes, from: Date/* 2018-01-16 01:00:00 */, to: Date/* 2018-01-16 02:00:00 */ )

我希望数组变成:

[ Date/* 2018-01-16 01:00:00 */, Date/* 2018-01-16 01:15:00 */,  Date/* 2018-01-16 01:30:00 */, Date/* 2018-01-16 01:45:00 */, Date/* 2018-01-16 02:00:00 */]

【问题讨论】:

标签: swift


【解决方案1】:

逻辑可能是这样的。创建以开始日期为第一个元素的数组。然后将带有添加组件的日期附加到最后一个日期,直到新日期应该大于结束日期

func pad(to repletion: Int, _ component: Calendar.Component, from: Date? = nil, to: Date? = nil) {

    guard let start = from ?? self.earliest, let end = to ?? self.latest else {
        print("no date given and none available")
        return
    }

    var components = DateComponents()
    components.setValue(repletion, for: component)
    let calendar = Calendar.current

    var dates = [start] // results

    while start < end {
        if let newDate = calendar.date(byAdding: components, to: dates.last!), 
           newDate <= end {
            dates.append(newDate)
        } else { break }
    }

}

【讨论】:

    【解决方案2】:

    这是我的变体,假设期间由 startend 日期给出

    let quarter: TimeInterval = 15 * 60
    let dateInterval = DateInterval(start: start, end: end)
    
    var date = start
    var result = [Date]()
    while dateInterval.contains(date) {
        result.append(date)
        date = date.addingTimeInterval(quarter)
    }
    

    【讨论】:

    • date = date.addingTimeInterval(quarter) 可以缩短为date += quarter
    猜你喜欢
    • 2016-01-04
    • 2022-06-18
    • 2012-07-09
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2015-07-01
    相关资源
    最近更新 更多