检查时间是否在范围内

时间:2016-01-26 21:23:15

标签: swift core-data nsdate nsdateformatter nsdatecomponents

在应用程序中,我从核心数据中获取值(此值是日期),并将其与时间(以字符串的格式)进行比较,并相应地执行操作。但是由于某些原因,if语句似乎不起作用。无论哪个时间结果总是使用值1(时间0:00到5:30)进行划分(请检查下面的代码)。我已经检查过核心数据获取是否具有正确的名称,是的,它应该正常工作。有人有主意吗?

func calculate(){

        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext
        let fetchRequest = NSFetchRequest(entityName: "Settings")

        do {
            let results = try managedContext.executeFetchRequest(fetchRequest)
            Settings = results as! [NSManagedObject]

            for result in results as! [NSManagedObject] {

                correctionRatio = result.valueForKey("correctionRatio") as! Int
                target = result.valueForKey("targetbG") as! Int
                value1 = result.valueForKey("value1") as! Int
                value2 = result.valueForKey("value2") as! Int
                value3 = result.valueForKey("value3") as! Int
                value4 = result.valueForKey("value4") as! Int
                value5 = result.valueForKey("value5") as! Int

                if bGTextfield.text != "" && carbTextfield.text != "" {

                    current = Int(bGTextfield.text!)
                    carb = Int(carbTextfield.text!)

                    let currentTime = NSDate()
                    let timeFormatter = NSDateFormatter()
                    timeFormatter.locale = NSLocale.currentLocale()
                    timeFormatter.dateFormat = "HH:mm"
                    let time = timeFormatter.stringFromDate(currentTime)


                    if time > "00:00" && time < "5:30" {
                        food = carb / value1
                    } else if time > "5:31" && time < "11:00"{
                        food = carb / value2
                    } else if time > "11:01" && time < "17:00"{
                        food = carb / value3
                    } else if time > "17:01" && time < "21:30" {
                        food = carb / value4
                    } else if time > "21:31" && time < "23:59" {
                        food = carb / value5
                    }



                    if 4 ... 9 ~= Double(currentbG){

                        doseLabel.text = String(foodInsulin)


                    } else if 9.1 ... 100 ~= Double(currentbG) {

                        bgDiff = currentbG - targetbG
                        correction = bgDiff / correctionRatio
                        total = food + correctionInsulin

                        doseLabel.text = String(total)
                    }

    }

感谢

4 个答案:

答案 0 :(得分:2)

我在NSDate扩展程序中做了类似的事情:

private class func timeAsIntegerFromDate(date: NSDate) -> Int {
    let currentCal = NSCalendar.currentCalendar()
    currentCal.timeZone = NSTimeZone.localTimeZone()
    let comps: NSDateComponents = currentCal.components([NSCalendarUnit.Hour, NSCalendarUnit.Minute], fromDate: date)
    return comps.hour * 100 + comps.minute
}

private class func timeIsBetween(startDate: NSDate, endDate: NSDate) -> Bool {
    let startTime = NSDate.timeAsIntegerFromDate(startDate)
    let endTime = NSDate.timeAsIntegerFromDate(endDate)
    let nowTime = NSDate.timeAsIntegerFromDate(NSDate())

    if startTime == endTime { return false }

    if startTime < endTime {
        if nowTime >= startTime {
            if nowTime < endTime { return true }
        }
        return false
    } else {
        if nowTime >= startTime || nowTime < endTime {
            return true
        }
        return false
    }
}

我确信它可以清理一下并且有很多改进。我做的是将NSDate转换为Int然后检查哪个更小。基本原则是将时间乘以100并将分钟添加到结尾并进行比较。

答案 1 :(得分:0)

只是预感,但我认为你不能将时间与&gt;进行比较。和&lt;运营商。

Time comparisons in swift

那篇文章解释了如何正确地做到这一点。

此外,您将时间存储为字符串而不是日期。将其存储为日期。

答案 2 :(得分:0)

您正在对本质上为数字的值进行字符串比较。这有几个不同的方式,这是一个坏主意,这可以解释您的不准确结果。您可以比较这样的字符串,但规则与数字比较的规则不同。

如果您想比较时间,请比较时间。您可以从以下内容开始:

let components = NSCalendar.currentCalendar().componentsInTimeZone(NSTimeZone.localTimeZone(), fromDate: NSDate())

从那里,components将包含名为hourminute的数字属性。使用它们进行比较。

答案 3 :(得分:0)

如果您的日期是NSDate,则您希望将其存储为Int16。或者minutes + 60 * hours如果它是当天的分钟05:30,那么5 * 60 + 30 = 330将是{{1}}。一旦你&#39已经完成了创建与您感兴趣的那些值相匹配的谓词的微不足道。