比较 Date 元素返回错误的结果 - Swift



我专注于开发一个处理Date对象的应用程序。我遇到了一个与比较 2 个对象相关的问题Date我想我已经确定了问题,但无法真正找到解决方案。

请考虑以下事项:

extension Date{
func nextDay(distance: Int = 1) -> Date {
return Calendar.current.date(byAdding: .day, value: distance, to: self)!
}
}
func generateTask(forProjects: [Project]){
for project in forProjects {
if tasks(forProject: project).isEmpty{
var startDate = Date()
var currentMilestone : Task = project.mostRecentMilestone
var indexMilestone : Int = 0
while startDate < project.lastMilestone.day!{ // Suppose last milestone differs 20 days from startDate
print("StartDate: (startDate), Current: (currentMilestone.day!)")
// Something
startDate = startDate.nextDay()
}
}
else {
print("Tasks already present")
}
}
DB.shared.save()
}
}

lastMilestone.day由以下代码生成:

lastMilestone.day = Date().nextDay(distance: 20)

一些澄清:Project是一个包含day: Date属性的结构,Task是另一个包含相同属性的对象。 假设我为每个while周期将日期增加 1 天。预期结果将是:

StartDate: 2020-05-20 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
StartDate: 2020-05-21 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
StartDate: 2020-05-22 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
...
StartDate: 2020-06-08 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
*EXIT LOOP*

而我得到

StartDate: 2020-05-20 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
StartDate: 2020-05-21 11:07:52 +0000, Current: 2020-06-09 11:07:49 +0000
*EXIT LOOP*

这意味着第二次比较失败。我尝试以这种方式更改代码:

//...
startDate = startDate.addingTimeInterval(3600*24)
//...

结果与以前相同。 我开始认为这与TimeZone设置有关,或者可能是从CoreData中包含的实体获取compareDate的事实。 关于我的第一个想法,我看到可以手动设置Calendar.current时区,但是当我尝试这样做时,我得到了一个read-only错误,这对我来说似乎是合理的。 知道吗?

编辑:由于我已经验证了此代码适用于干净的项目,因此我知道我必须更具体。相应更新。

编辑 2:根据要求,这里是 日期 的值lastMilestone.day

print("StartDate: (startDate), Current: (project.lastMilestone.day!)")
OUTCOME:
StartDate: 2020-05-20 17:59:48 +0000, Current: 2020-06-09 17:59:47 +0000

仅供参考,我想为我的问题留下一个解决方案,现在我看到它无法推断。

正如我所说,这个问题与核心数据和我的模型组织有关。 具体来说,Task实体在//Something部分中纵,但我没有注意到核心数据模型中的特定关系会影响存储在项目中的任务的值。

更清楚的是,我的应用程序的结构如下:Task可以是正常任务,也可以是里程碑。它们具有相同的含义,但我知道它们需要是两个独立的概念。事实上,它们都与项目有共同的关系,项目只是以里程碑为参考。然而,它们具有相同的反向关系。这可能会导致对Task属性的操纵day从而使答案中的while循环无效。

解决方案是分离实体并删除反向关系。

对于我的问题准确性差,我真的很抱歉,我应该更详细地解释这个问题。

最新更新