2017-03-24 113 views
0

我已按照屬性time排序了我的list對象,它是String而不是date。在排序前替換字符串列表中的字符

樣本輸出:

07:05:10 AM 
07:05:01 AM 
07:04:49 AM 
07:04:44 AM 
06:53:58 AM 
06:53:47 AM 
01:03:21 AM 
12:03:21 AM 

和調用instrudtion後:

self.myList = self.myList.sorted { $0.mytime < $1.mytime } 

會是這樣的:

01:03:21 AM 
06:53:47 AM 
06:53:58 AM 
07:04:44 AM 
07:04:49 AM 
07:05:01 AM 
07:05:10 AM 
12:03:21 AM 

我能代替12:03:21 AM00:03:21 AM只有當它是AM12在開始?

還是有不同的方式來做到這一點?

在此先感謝!

+4

這是一個XY問題。你不應該比較基於* string *表示的日期。將它們轉換爲'Date'(或一些數字時間戳)。 –

+0

上午12:03和上午00:03不是同一時間 –

+1

您沒有正確排序。它應該首先根據am/pm排序,然後您可以根據前綴(時間)進行排序。我會先排序日期,然後得到字符串 –

回答

1

我想這就是你要找的。總是用這種方式比較日期!

override func viewDidLoad() { 
    super.viewDidLoad() 
    var arrayOfDates = ["07:05:10 AM", 
         "07:05:01 AM", 
         "07:04:49 AM", 
         "07:04:44 AM", 
         "06:53:58 AM", 
         "06:53:47 AM", 
         "01:03:21 AM", 
         "12:03:21 AM"] 

    // This will throw an error if any of your dates are 
    // misformatted, so handle that appropriately.     
    arrayOfDates.sort() { $0.toDate()!.compare($1.toDate()!) == ComparisonResult.orderedDescending } 
    print("Descending: \(arrayOfDates)") 

    arrayOfDates.sort() { $0.toDate()!.compare($1.toDate()!) == ComparisonResult.orderedAscending } 
    print("Ascending: \(arrayOfDates)") 
} 

extension String { 
    func toDate() -> Date? { 
    let formatter = DateFormatter() 
    formatter.dateFormat = "hh:mm:ss a" 
    if let date = formatter.date(from: self) { 
     return date 
    } else { 
     return nil 
    } 
} 

//If you need a string version of the date you can use this as well 
extension Date { 
    func toString() -> String { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "hh:mm:ss a" 
     return formatter.string(from: self) 
    } 
} 
+0

你試過編譯它嗎? –

+0

謝謝!這正是我想要的。我正在尋找這個。雖然我已經用循環做出瞭解決方案,但看起來很髒。我會留在你的執行:) – yerpy

+0

@MartinR不,我沒有....我從內存中寫道。它有問題嗎?它使用我每天使用的代碼,所以如果有一個bug很小。 – Sethmr