【问题标题】:How to convert dates range into string in swift 3?如何在swift 3中将日期范围转换为字符串?
【发布时间】:2018-03-30 09:15:39
【问题描述】:

如何将日期转换为字符串格式?

我得到两个日期之间的日期(从开始到结束日期)。我正在使用以下方法

class Dates {
static func printDatesBetweenInterval(_ startDate: Date, _ endDate: Date) {
    var startDate = startDate
    let calendar = Calendar.current

    let fmt = DateFormatter()
    fmt.dateFormat = "yyyy-MM-dd"

    while startDate <= endDate {
        print(fmt.string(from: startDate))
        startDate = calendar.date(byAdding: .day, value: 1, to: startDate)!
    }
}

static func dateFromString(_ dateString: String) -> Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"

    return dateFormatter.date(from: dateString)!
}}

在这里打印日期

Dates.printDatesBetweenInterval(Dates.dateFromString("2017-10-02"), Dates.dateFromString("2017-10-9"))

结果:

2017-10-02 2017-10-03 2017-10-04 2017-10-05 2017-10-06 2017-10-07 2017-10-08 2017-10-09

现在,我想将此日期以字符串格式传递给日历(我在应用程序中使用 FSCalendar 库)。我想要这种格式 示例:

["2017-10-02", "2017-10-03", "2017-10-04", "2017-10-05", "2017-10-06", "2017-10-07", "2017-10-08", "2017-10-09"]

谁能指导我。谢谢

【问题讨论】:

    标签: ios arrays swift string calendar


    【解决方案1】:

    从你的函数返回日期字符串数组,像这样:

    class Dates {
    static func printDatesBetweenInterval(_ startDate: Date, _ endDate: Date) -> [String] {
        var startDate = startDate
        let calendar = Calendar.current
    
        let fmt = DateFormatter()
        fmt.dateFormat = "yyyy-MM-dd"
    
        var arrayDateString = [String]()
    
        while startDate <= endDate {
            let stringDate = fmt.string(from: startDate)
            print("stringDate - \(stringDate)")
            arrayDateString.append(stringDate)
            startDate = calendar.date(byAdding: .day, value: 1, to: startDate)!
        }
    
       return arrayDateString
    }
    
    static func dateFromString(_ dateString: String) -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"
    
        return dateFormatter.date(from: dateString)!
    }}
    

    现在,打印字符串数组

    let dateStringArray = Dates.printDatesBetweenInterval(Dates.dateFromString("2017-10-02"), Dates.dateFromString("2017-10-9"))
    
    print("dateStringArray - \(dateStringArray)")
    

    编辑:
    现在,正如您所说,您拥有以下格式的数据:

    let dataArray = [ 
     { "hlddate": "07-Aug", "frmdt": "07-Aug-2017", "todt": "07-Aug-2017" }, 
     { "hlddate": "15-Aug", "frmdt": "15-Aug-2017", "todt": "15-Aug-2017" }, 
     { "hlddate": "10-Oct", "frmdt": "10-Oct-2017","todt": "31-Oct-2017" } 
    ]
    

    尝试以下解决方案(复制粘贴、dataAray 和类结构并查看结果):

    class Dates {
    
    static func dateFromString(dateString: String, webResponseDateFormat: String = "yyyy-MM-dd") -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = webResponseDateFormat
        return dateFormatter.date(from: dateString)
     }}
    
     static func printDatesBetweenInterval(startDate: Date, endDate: Date, requiredDateFormat: String = "yyyy-MM-dd") -> [String] {
        var startDate = startDate
        let calendar = Calendar.current
    
        let fmt = DateFormatter()
        fmt.dateFormat = requiredDateFormat
    
        var arrayDateString = [String]()
    
        while startDate <= endDate {
            let stringDate = fmt.string(from: startDate)
            print("stringDate - \(stringDate)")
            arrayDateString.append(stringDate)
            startDate = calendar.date(byAdding: .day, value: 1, to: startDate)!
        }
    
       return arrayDateString
     }
    
    
    if let stringDateArray = dataArray as? [[String : String]] {
    
       for arrayElement in stringDateArray {
    
           if let startDateString = arrayElement["frmdt"], let startDate = Dates.dateFromString(dateString: startDateString, webResponseDateFormat: "dd-MMM-yyyy"), let endDateString = arrayElement["todt"], let endDate = Dates.dateFromString(dateString: endDateString, webResponseDateFormat: "dd-MMM-yyyy") {
    
               let dateStringArray = Dates.printDatesBetweenInterval(startDate: startDate, endDate: endDate, )
    
               print("\n\n**\ndateStringArray - \(dateStringArray)")
           }
       }
    
    }
    

    最终更新

    // Actual data structure
    let dataArray = ["07-8-2017","08-08-2017","10-09-2017","20-10-2017",21-10-2017","23-10-2017", etc..] 
    

    使用上述方法并在服务器响应部分更改数据并获取结果。

    if let Streams = jsonDict["data"] as! [AnyObject]? {
    
       for arrayElement in Streams {
    
            if let startDateString = arrayElement["frmdt"] {
                 self.somedateFromString = self.convertStringToDate(string: startDateString as! String)
    
                if  let endDateString = arrayElement["todt"] {
                    self.somedateEndString = self.convertStringToDate(string: endDateString as! String)
                }
    
       self.presentdays = Dates.printDatesBetweenInterval(Dates.dateFromString(self.somedateFromString), Dates.dateFromString(self.somedateEndString))
    
            self.totalHolidays.append(contentsOf: self.presentdays)
    
         }
      }
    }
    

    【讨论】:

    • 谢谢!这工作正常,但是 ''"data": [ { "hlddate": "07-Aug", "frmdt": "07-Aug-2017", "todt": "07-Aug-2017" }, { “hlddate”:“8 月 15 日”,“frmdt”:“2017 年 8 月 15 日”,“todt”:“2017 年 8 月 15 日”},{ “hlddate”:“10 月 10 日”,“frmdt”: "2017 年 10 月 10 日","todt": "2017 年 10 月 31 日" } ]' ' 这是我收到服务器的响应。以及如何将单个数组传递给日历,请指导我。
    • 'let dataArray = [ { "hlddate": "07-Aug", "frmdt": "07-Aug-2017", "todt": "07-Aug-2017" }, { “hlddate”:“8 月 15 日”,“frmdt”:“2017 年 8 月 15 日”,“todt”:“2017 年 8 月 15 日”},{ “hlddate”:“10 月 10 日”,“frmdt”: “2017 年 10 月 10 日”,“todt”:“2017 年 10 月 31 日”}]'。不,我需要像这种格式一样采用一组所有日期。例如:-- ' 让 dataArray =[“07-08-2017”、“15-08-2017”、“10-10-2017”、“11-10-2017”、“12-10-2017”、“13 -10-2017", -------- , "30-10-2017", "31-10-2017"]
    • 我做了你更新的答案,我正在将最后一个数据数组放入字典中,例如:'["2017-10-10", "2017-10-11", "2017-10-12" , “2017-10-13”, “2017-10-14”, “2017-10-15”, “2017-10-16”, “2017-10-17”, “2017-10-18”, “ 2017-10-19”、“2017-10-20”、“2017-10-21”、“2017-10-22”、“2017-10-23”、“2017-10-24”、“2017- 10-25”、“2017-10-26”、“2017-10-27”、“2017-10-28”、“2017-10-29”、“2017-10-30”、“2017-10- 31"]'。我没有添加到其中的第一个和第二个数组中。但我打印了第一个和第二个数组日期。请指导我
    • 好的,给我一些时间,我会提供准确的解决方案和结果。
    • 谢谢!。没问题,慢慢来,如果您发现了,请给我发送解决方案。我也在尝试从我这边解决问题。
    【解决方案2】:
    static func getDatesStringBetweenInterval(_ startDate: Date, _ endDate: Date)-> String {
            var retval = "["
    
            var startDate = startDate
            let calendar = Calendar.current
    
            let fmt = DateFormatter()
            fmt.dateFormat = "yyyy-MM-dd"
    
            while startDate <= endDate {
                if startDate < endDate {
                    retval.append("\"\(fmt.string(from: startDate))\", ")
                } else {
                   retval.append("\"\(fmt.string(from: startDate))\"")
                }
                startDate = calendar.date(byAdding: .day, value: 1, to: startDate)!
            }
            retval.append("]")
    
            return retval
        }
    

    用法:

    let aDate = Dates.dateFromString("2017-01-01")
    let bDate = Dates.dateFromString("2017-01-05")
    let datesString = Dates.getDatesStringBetweenInterval(aDate, bDate)
    print(datesString)
    

    【讨论】:

    • OP 需要一个日期字符串数组
    • "现在,我想将这个日期传递给字符串格式"
    • ["2017-10-02", "2017-10-03", "2017-10-04", "2017-10-05", "2017-10-06", "2017-10-07", "2017-10-08", "2017-10-09"] 看起来不像一个字符串
    • @losDeveloper,请具体说明您需要的格式。
    • 没有 api 需要一个字符串,其中包含用逗号分隔的一堆日期
    猜你喜欢
    • 2017-09-16
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多