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

Ios 在数组中查找最大和最小日期,ios,swift,nsdate,Ios,Swift,Nsdate,我有一个类似的数组 "11 Aug 2015", "24 Sep 2014", "25 Aug 2014", "07 Aug 2014", "07 Aug 2014" 我想在里面找到最长和最短的日期 modifieddateArray.valueForKeyPath("@max.self") modifieddateArray.valu

我有一个类似的数组

    "11 Aug 2015",
    "24 Sep 2014",
    "25 Aug 2014",
    "07 Aug 2014",
    "07 Aug 2014"
我想在里面找到最长和最短的日期

modifieddateArray.valueForKeyPath("@max.self")
modifieddateArray.valueForKeyPath("@min.self")
我使用了上面的函数,它给出了

截至2014年8月25日的最大值

截至2014年8月7日

但最长日期为2015年8月11日,最短日期为2014年9月7日

它考虑的第一个值大于25,至少为07。我怎样才能解决这个问题


提前感谢

这肯定不是最有效的方法,但非常简单,编写代码也很有趣:

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)))
var日期=[“2015年8月11日”,
“2014年9月24日”,
“2014年8月25日”,
“2014年8月7日”,
“2014年8月7日”]
风险值月份=[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”]
变量monthsNum=[“01”、“02”、“03”、“04”、“05”、“06”、“07”、“08”、“09”、“10”、“11”、“12”]
func转换项(日期:字符串)->Int{
var arr=split(日期){$0==“”}
变量c=1
月复一月{
如果(arr[1]==月){
如果(c<10){
返回(arr[2]+“0”+字符串(c)+arr[0]).toInt()!
}
否则{
返回(arr[2]+字符串(c)+arr[0]).toInt()!
}
}
C++
}
返回0
}
func convertToString(日期:Int)->字符串{
var dateString=字符串(日期)作为NSString
var year=dateString.substringWithRange(NSRange(位置:0,长度:4))
var month=dateString.substringWithRange(NSRange(位置:4,长度:2))
var day=dateString.substringWithRange(NSRange(位置:6,长度:2))
var c=0
在monthsNum的curMonth{
如果(curMonth==月){
返回年份+“”+月份[c]+“”+天
}
C++
}
返回“”
}
var newDates=[Int]()
日期中的日期{
newDates.append(转换(日期))
}
println(convertToString(maxElement(newDates)))
println(convertToString(minElement(newDates)))
通过使用Swift强大的内置功能:
//运算符重载方法
func>(左:NSDate,右:NSDate)->Bool{
返回lhs.compare(rhs)=NSComparisonResult.OrderedAscending
}
func Bool{
返回lhs.compare(rhs)=NSComparisonResult.OrderedDescending
}
//迄今为止的字符串
func dateFromString(dateStr:String)->NSDate{
让dateFormatter=NSDateFormatter()
dateFormatter.dateFormat=“dd LLL yyyy”
//Eric D的建议,强制区域设置为en_en
dateFormatter.locale=NSLocale(localeIdentifier:“en_en”)
返回dateFormatter.dateFromString(dateStr)!
}
//日期字符串
func stringFromDate(日期:NSDate)->字符串{
让dateFormatter=NSDateFormatter()
dateFormatter.dateFormat=“dd LLL yyyy”
//Eric D的建议,强制区域设置为en_en
dateFormatter.locale=NSLocale(localeIdentifier:“en_en”)
return dateFormatter.stringFromDate(日期)
}
//字符串日期数组
风险值日期=[“2015年8月11日”,
“2014年9月24日”,
“2014年8月25日”,
“2014年8月7日”,
“2014年8月7日”]
//将字符串映射到NSDate
var dateInstances=dates.map({dateFromString($0)})
//找到Max
让maxVal=stringFromDate(dateInstances.reduce(dateInstances[0]){$0>$1?$1:$0})
//找敏
让minVal=stringFromDate(dateInstances.reduce(dateInstances[0]){$0<$1?$1:$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)")

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

您需要将此字符串格式的日期转换为
NSDate
对象,然后在其上运行最大/最小日期。检查此链接:感谢dude的主意。在“字符串到日期”中,它将与英语以外的其他语言环境崩溃(例如,因为'Aug'仅在英语中有效)。为了防止出现这种情况,请根据字符串1强制区域设置。在这种情况下:
dateFormatter.locale=NSLocale(localeidentier:“en_en”)
@EricD。谢谢你的建议,这是一个非常好的观点。我立即添加了它:)这不仅是“不是最有效的方法”但在处理
语言环境
和利用Swift强大的功能时容易失败。硬编码日期值和名称是个坏主意。
 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)")