如何在Swift 3中将天数添加到日期

16

我从服务中获取了天数、开始日期和结束日期。我想要获得开始日期和结束日期之间所有日期的列表。假设我的开始日期是2017/08/15,结束日期是2017/08/16,天数为2。

但是我得到的日期列表是这样的。

##### CONVERTED STRING DATE 2017-08-16

##### CONVERTED STRING DATE  2017-08-17

##### CONVERTED STRING DATE 2017-08-18

我有另一个日期是这样的

开始日期为2017/08/23,结束日期为2017/09/01,持续天数为8天。那么我会得到以下列表。

##### CONVERTED STRING DATE  2017-08-24

##### CONVERTED STRING DATE  2017-08-25

##### CONVERTED STRING DATE  2017-08-28

##### CONVERTED STRING DATE  2017-08-29

##### CONVERTED STRING DATE  2017-08-30

##### CONVERTED STRING DATE  2017-08-31


##### CONVERTED STRING DATE  2017-09-01

这是我获取日期数组的方法

 numberOfDates=Int(ceil(numOfDay))
                        //numberOfDates=numberOfDates-1
                        let arrayDates=self.generateDates(startDate: startDate, addbyUnit: .day, value: numberOfDates)

这是我的日期计算方法

internal func generateDates(startDate :Date?, addbyUnit:Calendar.Component, value : Int) -> [Date]
{
    //print("####START DATE#######\(startDate)")
    var calendar = Calendar.current
    calendar.timeZone=TimeZone.current
    var datesArray: [Date] =  [Date] ()

    for i in 0 ... value {
        var addAmount:Int!
        if(value==0)
        {
            addAmount=0
        }
        else
        {
            addAmount=1
        }
        if let newDate = calendar.date(byAdding: addbyUnit, value: i + addAmount, to: startDate!) {

            let strDayName=self.getDayName(mydate: newDate)
            if (strDayName != "Saturday" && strDayName != "Sunday")
            {
                datesArray.append(newDate)
            }

        }
    }

    return datesArray
}

我的问题是有时日期列表错误(第一种情况),但在第二种情况下它是正确的。

2个回答

22

你正在把它变得非常复杂。只需使用简单的日期类方法来计算差值,并使用for循环和Calendar类生成新日期即可。

let startDate = Date()
let endDate = Date(timeInterval: 2*86400, since: startDate)


let components = Calendar.current.dateComponents([.day], from: startDate, to: endDate)
let numberOfDays = components.day ?? 0

for i in 1...numberOfDays {
    let nextDate = Calendar.current.date(byAdding: .day, value: i, to: startDate)
    print(nextDate)
}

谢谢。你能解释一下这个区别是什么吗? - user1960169
10
不要将86400秒作为一天的持续时间(考虑夏令时)。 - Martin R
第二行中的86400只是一个示例,因为您将从服务器获取结束日期。 - user7649191
1
请直接使用以下代码:Calendar.current.date(byAdding: .day, value: i, to: startDate)。例如:i = 天数,startDate = 任意日期。这种方法对我很有效。 - xhinoda

22

一个简单的 while 循环可以帮助你得到所需的结果。 示例:

func generateDates(startDate :Date?, addbyUnit:Calendar.Component, value : Int) -> [Date] {

    var dates = [Date]()
    var date = startDate!
    let endDate = Calendar.current.date(byAdding: addbyUnit, value: value, to: date)!
    while date < endDate {
        date = Calendar.current.date(byAdding: addbyUnit, value: 1, to: date)!
        dates.append(date)
    }
    return dates
}

编辑:或者如果您提前得到了截止日期,您也可以稍微更改一下实现方式。

func generateDates(between startDate: Date?, and endDate: Date?, byAdding: Calendar.Component) -> [Date] {

    var dates = [Date]()
    guard var date = startDate, let endDate = endDate else {
        return []
    }
    while date < endDate {
        date = Calendar.current.date(byAdding: byAdding, value: 1, to: date)!
        dates.append(date)
    }
    return dates
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接