ios - 过滤今天、昨天的 NSDate 数组以进行绘图

标签 ios arrays swift plot nsdate

我有一组带有时间戳的日记条目。

class JournalNoteEntry {
var timeCreated: NSDate?
var value: Int?
var note: String?
}

如何过滤此数组以查找今天、昨天、本周、本月等条目,并绘制我的 valuetimeCreated 并标记 X -轴

我为这个基本需求进行了很多搜索,但找不到答案。

有人可以帮忙吗...

最佳答案

由于您是使用 Swift 3 编写的,因此您应该使用原生 Swift 类型而不是 Foundation 的类(以 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)

关于ios - 过滤今天、昨天的 NSDate 数组以进行绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40462561/

相关文章:

ios - 如何使用 Xcode 自动完成枚举开关?

ios - 如何在一行中声明变量和枚举声明?

ios - 在 RestKit 中使用请求特定的 HTTP header

javascript - PHP、Javascript 获取mysql数据并在javascript中进行计算

swift - 代码未完成该功能,正在中途结束执行

ios - Xcode 9-无法发出预编译的 header

ruby-on-rails - Ruby on Rails - 选择数组中的所有 ID

arrays - 无需重复大量代码即可访问数组的边界

objective-c - 不断更新TableView中单元格内的数据

swift - 添加新联系人后未调用controllerDidChangeContent