【问题标题】:Create string array of dates from Dates range从日期范围创建日期字符串数组
【发布时间】:2018-03-08 09:39:58
【问题描述】:

我有Date() 属性。 startingAt 和 endingAt。还有一个 Date() 数组,它们是alreadyRegistred。我必须创建一个日期在startingAt 和endingAt 之间的字符串数组。 StartingAt 和 endingAt 包括在内,最后一个要求是排除 alreadyRegistred 日期。

你有什么优雅的想法,怎么做?感谢您的帮助!

编辑:最终数组中的最大日期数约为 7 天。

【问题讨论】:

  • 在两个给定的Dates 之间有无限多个Dates。 – 如果您正在考虑 天,那么这可能有助于作为起点:stackoverflow.com/questions/32536612/….
  • 在这种情况下,最终数组中的最大日期约为 7 天。

标签: ios arrays swift date date-range


【解决方案1】:

不要忘记Date 基本上只是一个时间戳,您可以访问addingTimeInterval(_:) 方法。

知道了这一点,就很容易在两个日期之间进行一些计算。

我不完全了解您所需的业务逻辑,但这是一个在两个日期之间生成 Dates 的简单实现。我相信您可以在操场上运行它并进行一些探索。

import UIKit

func intervalDates(from startingDate:Date, to endDate:Date, with interval:TimeInterval) -> [Date] {
    guard interval > 0 else { return [] }

    var dates:[Date] = []
    var currentDate = startingDate

    while currentDate <= endDate {
        currentDate = currentDate.addingTimeInterval(interval)
        dates.append(currentDate)
    }

    return dates
}


let startingDate = Date() // now
let endDate = Date(timeIntervalSinceNow: 3600 * 24 * 7) // one week from now
let intervalBetweenDates:TimeInterval = 3600 * 3// three hours

let dates:[Date] = intervalDates(from: startingDate, to: endDate, with: intervalBetweenDates)



let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .long

let dateStrings = dates.map{dateFormatter.string(from: $0)}

print("NOW : \(startingDate)")
for (index, string) in dateStrings.enumerated() {
    print("\(index) : \(string)")
}
print("END DATE : \(endDate)")

【讨论】:

    【解决方案2】:

    试试这个看看:

    // Start & End date string
    let startingAt = "01/01/2018"
    let endingAt = "08/03/2018"
    
    // Sample date formatter
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"
    
    // start and end date object from string dates
    var startDate = dateFormatter.date(from: startingAt) ?? Date()
    let endDate = dateFormatter.date(from: endingAt) ?? Date()
    
    // String date array, to be excluded
    let alreadyRegistred = ["01/01/2018", "15/01/2018", "10/02/2018", "20/02/2018", "05/03/2018"]
    
    // Actual operational logic
    var dateRange: [String] = []
    while startDate <= endDate {
        let stringDate = dateFormatter.string(from: startDate)
    
        startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
        if (alreadyRegistred.contains(stringDate)) {
            continue
        } else {
            dateRange.append(stringDate)
        }
    
    }
    
    print("Resulting Array - \(dateRange)")
    

    结果如下:

    结果数组 - [“02/01/2018”、“03/01/2018”、“04/01/2018”、“05/01/2018”、“06/01/2018”、“07/ 01/2018”、“08/01/2018”、“09/01/2018”、“10/01/2018”、“11/01/2018”、“12/01/2018”、“13/01/ 2018”、“14/01/2018”、“16/01/2018”、“17/01/2018”、“18/01/2018”、“19/01/2018”、“20/01/2018” , “21/01/2018”, “22/01/2018”, “23/01/2018”, “24/01/2018”, “25/01/2018”, “26/01/2018”, “ 27/01/2018”、“28/01/2018”、“29/01/2018”、“30/01/2018”、“31/01/2018”、“01/02/2018”、“02/ 02/2018”、“03/02/2018”、“04/02/2018”、“05/02/2018”、“06/02/2018”、“07/02/2018”、“08/02/ 2018”、“09/02/2018”、“11/02/2018”、“12/02/2018”、“13/02/2018”、“14/02/2018”、“15/02/2018” , “16/02/2018”, “17/02/2018”, “18/02/2018”, “19/02/2018”, “21/02/2018”, “22/02/2018”, “ 23/02/2018”、“24/02/2018”、“25/02/2018”、“26/02/2018”、“27/02/2018”、“28/02/2018”、“01/ 03/2018”、“02/03/2018”、“03/03/2018”、“04/03/2018”、“06/03/2018”、“07/03/2018”、“08/03/ 2018"]

    【讨论】:

      【解决方案3】:
      let startDate = Date()
      let endDate = Date().addingTimeInterval(24*60*60*10) // i did this to get the end date for now
      var stringdateArray = [String]()
      
      if let days = getNumberofDays(date1: startDate, date2: endDate) {
      
          for i in 0...days-1 {
              let date = startDate.addingTimeInterval(Double(i)*24*3600)
              let stringDate =  getStringDate(fromDate: date, havingFormat: "yyyy-MM-dd")
              if !(alreadyRegisteredArray.contains(stringDate)) { // checking if already registered
                stringdateArray.append(stringDate)
             }
      
          }
      }
      

      还有我们的辅助方法

      let dateFormatter = DateFormatter()
      
      
      func getStringDate(fromDate: Date,havingFormat: String) -> String {
      
          dateFormatter.dateFormat = havingFormat
          dateFormatter.amSymbol = "AM"
          dateFormatter.pmSymbol = "PM"
          let date =  dateFormatter.string(from: fromDate)
          return  date
      }
      
      func getNumberofDays(date1: Date, date2: Date) -> Int? {
          let calendar = NSCalendar.current
      
          let date1 = calendar.startOfDay(for: date1)
          let date2 = calendar.startOfDay(for: date2)
      
          let components = calendar.dateComponents([.day], from: date1, to: date2)
          return components.day
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 2015-01-06
        • 2019-06-12
        • 1970-01-01
        • 2015-11-01
        相关资源
        最近更新 更多