2017-06-06 192 views
0

我有一個日期爲2017-07-06,2017-06-07,2017-07-07的數組。我想按升序對這些日期進行排序。所以2017-06-07會先到。但它並沒有發生。我正在使用下面的代碼:如何排序字符串的日期?

func sortDates(array:NSMutableArray)->[String] { 

     var strArray:[String] = [] 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd"// yyyy-MM-dd" 
     var convertedArray: [Date] = [] 
     for dat in array { 
      let date = dateFormatter.date(from: dat as! String) 
      convertedArray.append(date!) 
     } 
     let arrDates = convertedArray.sorted(by: { $0.compare($1) == .orderedAscending }) 
     for value in arrDates { 
      let formatter = DateFormatter() 
      // initially set the format based on your datepicker date 
      formatter.dateFormat = "yyyy-MM-dd" 
      let myString = formatter.string(from: value) 
      // convert your string to date 
      let yourDate = formatter.date(from: myString) 
      if yourDate != nil { 
       //then again set the date format whhich type of output you need 
       formatter.dateFormat = "yyyy-MM-dd" 
       // again convert your date to string 
       let myStringafd = formatter.string(from: yourDate!) 
       strArray.append(myStringafd) 
      } 
     } 
     return strArray 
    } 

請指導我在哪裏做錯了?

+1

當你說「它沒有發生」時,你是什麼意思?解釋你的代碼在做什麼。我不想通讀代碼來試圖理解它。並確定它做錯了什麼。 – Fogmeister

+1

使用'yyyy-MM-dd',而不是'mm'小寫字母用於分鐘(參見文檔http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns )。 – Larme

+1

除了標識符問題,你可以比較容易'$ 0 <$ 1' – vadian

回答

1

您可以創建一個擴展轉換stringdate,然後就追加所有dates-objectsarray和那種array

擴展:

extension String { 
    var toDate: Date { 
     return Date.Formatter.customDate.date(from: self)! 
    } 
} 

extension Date { 
    struct Formatter { 
     static let customDate: DateFormatter = { 
      let formatter = DateFormatter() 
      formatter.locale = Locale(identifier: "en_US_POSIX") 
      formatter.dateFormat = "yyyy-MM-dd" 
      return formatter 
     }() 
    } 
} 

用法:

let d1 = "2017-01-01".toDate 
let d2 = "2016-01-01".toDate 
let d3 = "2018-01-01".toDate 
let d4 = "2013-01-01".toDate 

let convertedArray = [d1,d2, d3, d4] 
let sorted = convertedArray.sorted() // note that the sort works on a string too. 
print(sorted) 
0
extension String { 

func date(format: String) -> Date? { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = format 
    let date = dateFormatter.date(from: self) 
    return date 
} 

} 
extension Date { 
func string(format: String) -> String { 
    let dateFormatterPrint = DateFormatter() 
    dateFormatterPrint.dateFormat = format 
    return dateFormatterPrint.string(from: self) as String 
} 
} 
var datesSting = ["2017-07-06","2017-08-07","2017-07-07"] 

let soteddates = datesSting.map { (obj) -> Date in 
    return obj.date(format: "yyyy-MM-DD")! 
} 

let sorteedStings = soteddates.sorted { (obj1, obj2) -> Bool in 
    return obj1.compare(obj2) == ComparisonResult.orderedAscending 
}.map { (obj) -> String in 
    return obj.string(format: "yyyy-MM-DD") 
} 

print(sorteedStings) 
0

這裏是我的代碼:

let arrCurrentDate = [「2017-07-06」, 「2017-06-07", 「2017-07-07」] 
    var arrConverted: [Date] = [] 

    let dateFrmt = DateFormatter() 
    dateFrmt.dateFormat = 「yyyy-MM-dd」 

    for dateCurrent in arrCurrentDate { 
    let date = dateFrmt.date(from: dateCurrent) 
    arrConverted.append(date!) 
    }  
    arrConverted.sort(by: {$0.compare($1) == .orderedAscending})  
    arrConverted.sorted(by: {$0.timeIntervalSince1970 < $1.timeIntervalSince1970}) 

    print(arrConverted) 

您也可以更改您的訂單:

.orderedAscending .orderedSame .orderedDescending

0

這是沒有必要將這些字符串轉換爲Date類型。您可以簡單地將它們排序爲字符串,然後按照正確的順序排列。

相關問題