2017-03-24 74 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