在数组中查找最大和最小日期

4

I have a array like

    "11 Aug 2015",
    "24 Sep 2014",
    "25 Aug 2014",
    "07 Aug 2014",
    "07 Aug 2014"

我希望找到IT领域中的最大和最小日期。

modifieddateArray.valueForKeyPath("@max.self")
modifieddateArray.valueForKeyPath("@min.self")

我使用了上述函数,输出结果如下:

最大值为2014年8月25日

最小值为2014年8月7日

但实际上最大日期应该是2015年8月11日,最小日期应该是2014年9月7日。
这是因为它只考虑了第一个数作为最大或最小值。您可以通过以下方式解决此问题。
感谢您的提问。

2
你需要将这个字符串格式的日期转换成一个 NSDate 对象,然后在其上运行最大/最小日期。 - Shamas S
1
请查看此链接:http://stackoverflow.com/questions/18462763/how-to-sort-the-array-that-contains-date-in-strings-in-descending-order - Vishnuvardhan
谢谢,伙计,我有一个想法。 - iSekhar
3个回答

7
通过使用Swift强大的内置函数:
// Operator Overloading Methods
func >(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == NSComparisonResult.OrderedAscending
}

func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == NSComparisonResult.OrderedDescending
}

// String to date
func dateFromString(dateStr: String) -> NSDate {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd LLL yyyy"

    // Eric D's suggestion, forcing locale to en_EN
    dateFormatter.locale = NSLocale(localeIdentifier: "en_EN")

    return dateFormatter.dateFromString(dateStr)!
}

// Date to String
func stringFromDate(date: NSDate) -> String {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd LLL yyyy"

    // Eric D's suggestion, forcing locale to en_EN
    dateFormatter.locale = NSLocale(localeIdentifier: "en_EN")

    return dateFormatter.stringFromDate(date)
}

// Array of String Dates
var dates = ["11 Aug 2015",
    "24 Sep 2014",
    "25 Aug 2014",
    "07 Aug 2014",
    "07 Aug 2014"]

// Map the Strings to NSDate
var dateInstances = dates.map({dateFromString($0)})

// Find Max
let maxVal = stringFromDate(dateInstances.reduce(dateInstances[0]){$0 > $1 ? $1 : $0})

// Find Min
let minVal = stringFromDate(dateInstances.reduce(dateInstances[0]){$0 < $1 ? $1 : $0})

Playground输出:

Playground输出


1
在“字符串转日期”中,如果使用英语以外的其他语言环境,它将会崩溃(例如,“Aug”仅在英语中有效)。为了防止这种情况发生,应该根据字符串的语言环境强制设置相应的语言环境。在这种情况下:dateFormatter.locale = NSLocale(localeIdentifier: "en_EN") - Eric Aya
1
@EricD。谢谢您的建议,非常好的观点。我立刻添加了 :) - E-Riddie

0

这绝对不是最有效的方法,但相当简单,编码时很有趣:

var dates = ["11 Aug 2015",
            "24 Sep 2014",
            "25 Aug 2014",
            "07 Aug 2014",
            "07 Aug 2014"]

        var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        var monthsNum = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]


        func convertToInt (date : String) -> Int {

            var arr = split(date) {$0 == " "}

            var c = 1
            for month in months {
                if (arr[1] == month) {
                    if (c < 10) {
                        return (arr[2]+"0"+String(c)+arr[0]).toInt()!
                    }
                    else {
                        return (arr[2]+String(c)+arr[0]).toInt()!
                    }

                }
                c++
            }

            return 0
        }

        func convertToString (date : Int) -> String {

            var dateString = String(date) as NSString

            var year = dateString.substringWithRange(NSRange(location: 0, length: 4))
            var month = dateString.substringWithRange(NSRange(location: 4, length: 2))
            var day = dateString.substringWithRange(NSRange(location: 6, length: 2))

            var c = 0
            for curMonth in monthsNum {

                if (curMonth == month) {
                    return year+" "+months[c]+" "+day
                }
                c++
            }


            return ""

        }

        var newDates = [Int]()

        for date in dates {
            newDates.append(convertToInt(date))
        }


        println(convertToString(maxElement(newDates)))
        println(convertToString(minElement(newDates)))

4
这不仅是“不是最有效的方法”,而且在处理Locale并利用Swift的强大功能时容易失败。硬编码日期值和名称是一个糟糕的想法。 - Manuel

0

我已经这样做了

 var itemsArray ["24 Aug 2014","29 Jul 1990","06 Jan 2050","18 OCT 2014","24 Aug 2019"]


    for item in modifieddateArray {
        var maxDate2 : NSDate = dateFormatter.dateFromString(item as! String)! //as! NSDate
        var value : Int = Int(NSDate().timeIntervalSinceDate(maxDate2))
        itemsArray.addObject(value)
    }
    //println(itemsArray)

    var minDateNum: AnyObject! = itemsArray.valueForKeyPath("@max.self")
    var maxDateNum: AnyObject! = itemsArray.valueForKeyPath("@min.self")
    //println("\(maxDate, minDate)")

    var indexMax = itemsArray.indexOfObject(maxDateNum!)
    var indexMIn = itemsArray.indexOfObject(minDateNum!)

    //println("\(indexMax, indexMIn)")

    maxDate = modifieddateArray.objectAtIndex(indexMax)
    minDate = modifieddateArray.objectAtIndex(indexMIn)
    //println("\(maxDate, minDate)")

计算时间间隔并找到最小值作为最早日期和最大值作为最晚日期


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接