Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何按月份对获取的日期进行分组_Ios_Swift_Core Data - Fatal编程技术网

Ios 如何按月份对获取的日期进行分组

Ios 如何按月份对获取的日期进行分组,ios,swift,core-data,Ios,Swift,Core Data,我将数据插入到具有日期类型的核心数据中,但当我尝试从数据库中获取数据时,我无法按月对它们进行分组。你可以找到我试图寻找解决方案的代码,但它不起作用 let groupedDict = Dictionary(grouping: self.lessons) { (month) -> Date in return month.lessonDate! } var groupedMonth = [[Lessons]]() let keys = groupedD

我将数据插入到具有日期类型的核心数据中,但当我尝试从数据库中获取数据时,我无法按月对它们进行分组。你可以找到我试图寻找解决方案的代码,但它不起作用

let groupedDict = Dictionary(grouping: self.lessons) { (month) -> Date in
        return month.lessonDate!
    }
    var groupedMonth = [[Lessons]]()
    let keys = groupedDict.keys.sorted()
    keys.forEach { (key) in
        groupedMonth.append(groupedDict[key]!)
    }
    groupedMonth.forEach ({
        $0.forEach({print($0)})
        print("--------")
    })
如果我能给你一个我想要实现的例子。以下是一个例子:

样本日期:

  • 2017年7月4日

  • 2018年8月1日

  • 2018年8月2日

  • 2018年8月5日

  • 2018年9月19日

  • 2018年9月7日

我想将这些数据分组为

  • 2017年6月
  • 2018年8月
  • 2018年9月

感谢您帮助我

您必须以不同的方式使用
词典(分组:by:)
。您必须返回要分组依据的值,而不是每个课程都返回一个不同的组

助手 例子
您必须以不同的方式使用
词典(分组:按:)
。您必须返回要分组依据的值,而不是每个课程都返回一个不同的组

助手 例子
这是使用
DateComponents
按月份和年份使用
Dictionary(分组:by:)
对数组进行分组的起点

字典上的键是日期。您可以使用
DateFormatter
对它们进行排序并将其转换为字符串,然后格式化
“MMMM-yyyy”

如果无法从组件创建日期,则使用1970-1-1



旁注:当您强制展开
lessonDate
时,为什么它是可选的?

这是使用
字典(分组:按:)
按月份和年份使用
日期组件对数组进行分组的起点

字典上的键是日期。您可以使用
DateFormatter
对它们进行排序并将其转换为字符串,然后格式化
“MMMM-yyyy”

如果无法从组件创建日期,则使用1970-1-1



旁注:当你强制展开
课程日期时,为什么它是可选的?

展示你的
课程
结构声明我会把“日期”放在
[[04.07.2017]、[01.08.2018、02.08.2018、05.08.2018]、[19.09.2018、07.09.2018]
末尾,但你想把“MonthName+年”作为组名(关键?)所以可能[[“名称”:“2018年6月”,“课程”:[[2017年7月4日]]等]?@LeoDabus结构在核心数据中,课程是包含日期的核心数据对象element@Larme不,我只需要分组名称目前不需要数据我只需要将所有数据绑定并使其干净我想它们首先是排序的?您可以使用
reduce(into:)
或只是
reduce()与你不感兴趣的
next-last==1
不同,比较
next
last
是否在同一个月和同一年(
DateComponents
Calendar
应该对你有帮助)。展示你的
课程
结构声明我会把“日期”放在末尾
[[04.07.2017],[01.08.2018,02.08.2018,05.08.2018],[19.09.2018,07.09.2018],
或者您想要“MonthName+年”作为集团名称(关键?),因此可能[[“名称”:“2018年6月”,“课程”:[[04.07.2017]]等]?@LeoDabus结构在核心数据课程中是包含在日期中的核心数据对象element@Larme不,我只需要分组名称目前不需要数据我只需要绑定所有数据并使其干净我想它们首先是排序的?您可以使用
reduce(into:)
或只是
reduce()
。在那里查看我的答案或@LeoDabus one的答案(更简洁,但如果你不知道它是如何工作的,可能更难阅读,我的答案更明确/详细)。更改类型(
Int
=>
课程
)而不是你不感兴趣的
next-last==1
,而是比较
next
last
是否在同一个月和同一年(
DateComponents
日历
应该对你有帮助)。
“MMMM-YYYY”
是错误的。Y仅用于WeekOfYear。顺便说一句,每次调用此属性时,您都会创建一个新的DateFormattermonth属性,该属性应返回一个Int而不是日期。顺便说一句,为什么要向其添加一天?@LeoDabus我在UTC+2中,在创建UTC+0-Date时直接从上一个日期获取
日期组件
上个月的月末,而不是正确的月末。这就是我的猜测,为什么它显示“正确的月份-2小时”@LeoDabus从UTC+2只取
月份和年份
,然后以UTC+0打印总是有问题。或者是相反的方式?我很困惑,没关系。使用正确的区域设置进行格式化可以解决问题。感谢您的改进!
“MMMM YYYY”
是错误的。Y仅用于WeekOfYear。顺便说一句,每次调用此属性时,您都会创建一个新的DateFormattermonth属性,该属性应返回一个Int而不是日期。顺便说一句,为什么要向其添加一天?@LeoDabus我在UTC+2中,在创建UTC+0-Date时直接从上一个日期获取
日期组件
上个月的月末,而不是正确的月末。这就是我的猜测,为什么它显示“正确的月份-2小时”@LeoDabus从UTC+2只取
月份和年份
,然后以UTC+0打印总是有问题。还是相反?我很困惑,没关系。使用正确的区域设置进行格式化可以解决问题。感谢您的改进!感谢您向我展示了正确的路径我使用了您的分组函数并使用了其他函数答案的扩展名。所以我无法决定你们中的哪一个是正确的,因为有两个答案在某种程度上是正确的。谢谢你告诉我正确的路径,我使用了你的分组函数和其他
struct Lesson {
    let lessonDate: Date
}

extension Date {
    func addDays(_ days: Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: days, to: self)!
    }

    func addMonths(_ months: Int) -> Date {
        return Calendar.current.date(byAdding: .month, value: months, to: self)!
    }

    var month: Date {
        let calendar = Calendar.current
        return calendar.date(from: calendar.dateComponents([.month, .year], from: self))!
    }

    var prettyMonth: String {
        let formatter = DateFormatter()
        formatter.dateFormat = "MMMM yyyy"
        formatter.locale = Calendar.current.locale!

        return formatter.string(from: self)
    }

    var prettyDate: String {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        formatter.timeStyle = .medium
        formatter.locale = Calendar.current.locale!

        return formatter.string(from: self)
    }
}
func testing() {
    let lessons: [Lesson] = [
        .init(lessonDate: Date().addDays(2)),
        .init(lessonDate: Date().addDays(3)),
        .init(lessonDate: Date().addMonths(1).addDays(1)),
        .init(lessonDate: Date().addMonths(1).addDays(2)),
        .init(lessonDate: Date().addMonths(1).addDays(3)),
        .init(lessonDate: Date().addMonths(3)),
    ]

    let groupedDict = Dictionary(grouping: lessons, by: { $0.lessonDate.month })

    groupedDict
        .sorted(by: { a, b in a.key < b.key })
        .forEach {
            print("----- \($0.key.prettyMonth) -----")
            $0.value.forEach {
                print("\($0.lessonDate.prettyDate)")
            }
        }
}
----- August 2018 -----
29. Aug 2018 at 19:38:13
30. Aug 2018 at 19:38:13
----- September 2018 -----
28. Sep 2018 at 19:38:13
29. Sep 2018 at 19:38:13
30. Sep 2018 at 19:38:13
----- November 2018 -----
27. Nov 2018 at 19:38:13
let grouped = Dictionary(grouping: lessons) { lesson -> Date in
    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month], from: lesson.lessonDate!)
    return calendar.date(from: components) ?? Date(timeIntervalSince1970: 0)
}