检查时间是否在范围内
检查时间是否在范围内
在应用程序中,我从核心数据中获取一个值(该值是一个日期),并将其与时间(格式为字符串)进行比较,并根据情况执行操作。然而,出于某种原因,if语句似乎无法正常工作。无论是什么时间,结果始终使用value1(时间为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)
}
}
}
}
}
谢谢。
这段代码的目的是检查给定的时间是否在指定的时间范围内。它首先将传入的NSDate对象转换为整数表示,然后比较这些整数来判断时间是否在范围内。
代码中的timeAsIntegerFromDate函数将NSDate对象转换为整数表示。它使用当前的日历和时区来获取日期的小时和分钟,并将它们乘以100后相加得到整数表示。
timeIsBetween函数接受两个NSDate对象作为参数,表示时间范围的开始和结束时间。它首先调用timeAsIntegerFromDate函数将这些日期转换为整数表示。然后它获取当前时间,并将其转换为整数表示。接下来,它使用一些逻辑来判断当前时间是否在时间范围内。如果开始时间和结束时间相同,则返回false。如果开始时间小于结束时间,则判断当前时间是否大于等于开始时间且小于结束时间。如果开始时间大于结束时间,则判断当前时间是否大于等于开始时间或小于结束时间。
这段代码的问题在于它使用了NSDate对象和日期计算,这在Swift中已被废弃。建议使用新的Date结构和Calendar来进行日期和时间的计算。
下面是改进后的代码:
private class func timeIsBetween(startDate: Date, endDate: Date) -> Bool {
let calendar = Calendar.current
let now = Date()
let startTime = calendar.dateComponents([.hour, .minute], from: startDate)
let endTime = calendar.dateComponents([.hour, .minute], from: endDate)
let nowTime = calendar.dateComponents([.hour, .minute], from: now)
guard let startHour = startTime.hour, let startMinute = startTime.minute,
let endHour = endTime.hour, let endMinute = endTime.minute,
let nowHour = nowTime.hour, let nowMinute = nowTime.minute else {
return false
}
let startTimeInMinutes = startHour * 60 + startMinute
let endTimeInMinutes = endHour * 60 + endMinute
let nowTimeInMinutes = nowHour * 60 + nowMinute
if startTimeInMinutes == endTimeInMinutes {
return false
} else if startTimeInMinutes < endTimeInMinutes {
return nowTimeInMinutes >= startTimeInMinutes && nowTimeInMinutes < endTimeInMinutes
} else {
return nowTimeInMinutes >= startTimeInMinutes || nowTimeInMinutes < endTimeInMinutes
}
}
这段代码使用了新的Date结构和Calendar来进行日期和时间的计算。它首先获取当前时间,并将开始时间和结束时间分别转换为小时和分钟的组件。然后,它将这些时间转换为分钟表示,并使用类似的逻辑来判断当前时间是否在时间范围内。
这样改进的代码更加简洁和可读,并且使用了推荐的日期和时间处理方法。它可以更好地满足检查时间是否在范围内的需求。
问题的出现原因:代码中使用了错误的比较方法,尝试使用">"和"<"操作符来比较时间。同时,时间被存储为字符串,而不是日期类型。
解决方法:根据提供的链接,正确比较时间的方法是将时间存储为日期类型,并使用Date类型的比较方法。这样可以确保正确比较时间的区间。
以下是整理后的文章:
在代码中,我猜测你不能使用">"和"<"操作符来比较时间。在这个Stack Overflow的帖子中,解释了如何正确比较时间。
另外,你将时间存储为字符串而不是日期。建议你将时间存储为日期类型。
有人回答说这并不是我要找的答案。因为我想要判断当前时间是否在某个范围内。
在你的if语句中进行了比较测试。你使用">"和"<"操作符来比较两个字符串,这是不起作用的。
因此,你需要根据提供的链接,将时间存储为日期类型,并使用Date类型的比较方法。这样可以确保正确比较时间的区间。