在应用程序中,我从核心数据中获取值(此值是日期),并将其与时间(以字符串的格式)进行比较,并相应地执行操作。但是由于某些原因,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)
}
}
感谢
答案 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;运营商。
那篇文章解释了如何正确地做到这一点。
此外,您将时间存储为字符串而不是日期。将其存储为日期。
答案 2 :(得分:0)
您正在对本质上为数字的值进行字符串比较。这有几个不同的方式,这是一个坏主意,这可以解释您的不准确结果。您可以比较这样的字符串,但规则与数字比较的规则不同。
如果您想比较时间,请比较时间。您可以从以下内容开始:
let components = NSCalendar.currentCalendar().componentsInTimeZone(NSTimeZone.localTimeZone(), fromDate: NSDate())
从那里,components
将包含名为hour
和minute
的数字属性。使用它们进行比较。
答案 3 :(得分:0)
如果您的日期是NSDate
,则您希望将其存储为Int16
。或者minutes + 60 * hours
如果它是当天的分钟(05:30
,那么5 * 60 + 30 = 330
将是{{1}}。一旦你&#39已经完成了创建与您感兴趣的那些值相匹配的谓词的微不足道。