如何在swift 3中为日期添加天数

Posted

技术标签:

【中文标题】如何在swift 3中为日期添加天数【英文标题】:How to add days to a date in swift 3 【发布时间】:2017-08-08 14:05: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

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

【问题讨论】:

【参考方案1】:

一个简单的 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

【讨论】:

【参考方案2】:

你让它变得非常复杂。只需使用简单的日期类方法来区分,并使用 for 循环和日历类生成新日期。

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)

【讨论】:

谢谢。你能解释一下这有什么区别吗? 不要使用 86400 秒作为一天的持续时间(想想 DST) 第二行中的 86400 仅作为示例,因为您从服务器获取结束日期 只需使用:Calendar.current.date(byAdding: .day, value: i, to: startDate) 例如:i = days,starDate = anyDate。这对我有用。

以上是关于如何在swift 3中为日期添加天数的主要内容,如果未能解决你的问题,请参考以下文章

在 Netezza 中为日期添加天数

如何在 Swift 中获取两个日期之间的天数? [复制]

如何在 Swift 中为日期选择器设置特定的默认时间

如何在 swift 中为一个文本字段禁用 DatePicker 交互(用于选择日期)“

我如何在swift 5中找到2天之间的天数? [复制]

如何在swift3中获取两个日期之间的日历日[重复]