我有一组带有时间戳的日志条目。
class JournalNoteEntry {
var timeCreated: NSDate?
var value: Int?
var note: String?
}如何为“今日”、“昨天”、“本周”、“本月”等的条目过滤这个数组,绘制“我的value”和“timeCreated”,并给X轴加上标签
我寻找了很多这个基本的需求,但却找不到答案。
有人能帮忙吗..。
发布于 2016-11-08 03:23:12
由于您是用Swift 3编写的,所以应该使用本机Swift的类型,而不是基金会的类(以NS...开头的类):
class JournalNoteEntry {
var timeCreated: Date?
var value: Int?
var note: String?
}关于您的问题:让我们编写一个简单的函数来筛选开始日期和结束日期之间的所有条目:
func entries(in journal: [JournalNoteEntry], from: Date, to: Date) -> [JournalNoteEntry] {
return journal.filter {
guard let timeCreated = $0.timeCreated else {
return false
}
// Notice that this is half-open range
return from <= timeCreated && timeCreated < to
}
}您的大部分工作将是确定日期范围。一种方法是通过对Calendar类的扩展:
extension Calendar {
func todayRange() -> (Date, Date) {
let startDate = self.startOfDay(for: Date())
let endDate = self.date(byAdding: .day, value: 1, to: startDate)!
return (startDate, endDate)
}
func yesterdayRange() -> (Date, Date) {
let endDate = self.startOfDay(for: Date())
let startDate = self.date(byAdding: .day, value: -1, to: endDate)!
return (startDate, endDate)
}
func thisWeekRange() -> (Date, Date) {
var components = DateComponents()
components.weekday = self.firstWeekday
let startDate = self.nextDate(after: Date(), matching: components, matchingPolicy: .nextTime, direction: .backward)!
let endDate = self.nextDate(after: startDate, matching: components, matchingPolicy: .nextTime)!
return (startDate, endDate)
}
func thisMonthRange() -> (Date, Date) {
var components = self.dateComponents([.era, .year, .month], from: Date())
components.day = 1
let startDate = self.date(from: components)!
let endDate = self.date(byAdding: .month, value: 1, to: startDate)!
return (startDate, endDate)
}
}
// Run this in Playground to see it formatted in your local timezone
// If you call print(), it will always display in UTC
// Assuming today = Nov 7, 2016
Calendar.current.todayRange() // "Nov 7, 2016, 12:00 AM", "Nov 8, 2016, 12:00 AM"
Calendar.current.yesterdayRange() // "Nov 6, 2016, 12:00 AM", "Nov 7, 2016, 12:00 AM"
Calendar.current.thisWeekRange() // "Nov 6, 2016, 12:00 AM", "Nov 13, 2016, 12:00 AM"
Calendar.current.thisMonthRange() // "Nov 1, 2016, 12:00 AM", "Dec 1, 2016, 12:00 AM"若要在当前月份内获取所有日记账条目,请执行以下操作:
// journal is an array of JournalNoteEntry
let (startDate, endDate) = Calendar.current.thisMonthRange()
let results = entries(in: journal, from: startDate, to: endDate)发布于 2016-11-07 10:36:24
let predicate = NSPredicate(format: "timeCreated == %f", NSDate().timeIntervalSince1970)
let arrFiltedArray = array .filteredArrayUsingPredicate(predicate)如果timeCreated包含日期的timeIntervalSince1970,则意味着将数据类型从NSDate转换为双倍。
https://stackoverflow.com/questions/40462561
复制相似问题