【问题标题】:How to find the nearest date of the stored data如何找到存储数据的最近日期
【发布时间】:2016-04-16 01:36:33
【问题描述】:

例如:

  • 存储的数据:date = data1(2015.12.31), data2(2016.01.05), data3(2016.01.14), data4(2016.01.15), data5(2016.01.18)
  • 今天是2016.01.12
  • 那么最近的数据是data3

data3这里可以调用哪些方法?

realDate(datePicker.date), date(textField.text), content(textField.text) 在核心数据中。

var stores: Contact!
// Contact is CoreData Entity Name.
@IBOutlet weak var label: UILabel!

ViewController viewDidLoad :

let list = [stores]
let timeSort = list.map{_ in stores?.realDate!.timeIntervalSinceNow}.filter{$0 > 0}.sort(<)
  if let firstTime = timeSort.first {
  _ = NSDate(timeIntervalSinceReferenceDate: firstTime!)
    if timeSort.first != nil {
      label.text = stores?.content
    } else { }
  }

我试图获得编写代码的帮助。没有错误,标签上没有显示任何信息。

【问题讨论】:

  • 和你之前的问题stackoverflow.com/questions/34718367/…有什么不同?如果答案不让您满意,请要求作者澄清,并在问题中添加更多信息。但不要简单地重复它。
  • Martin R. 我明白了。谢谢。

标签: swift date time nsdate


【解决方案1】:

您可以使用 NSDate 属性 timeIntervalSinceNow 对日期进行排序并获取第一个正值:

编辑/更新:

Swift 3 引入了Date,它符合Comparable 协议,因此现在可以轻松排序:

extension Date {
    init?(_ year: Int,_ month: Int,_ day: Int) {
        guard let date = DateComponents(calendar: .current, year: year, month: month, day: day, hour: 12).date else { return nil }
        self = date
    }
}

游乐场测试:

let dateList = [Date(2018, 2, 18)!, Date(2017, 12, 31)!, Date(2018, 1, 5)!, Date(2018, 2, 14)!, Date(2018, 2, 15)!]

if let closestDate = dateList.sorted().first(where: {$0.timeIntervalSinceNow > 0}) { // "Feb 15, 2018, 12:00 PM"
    print(closestDate.description(with: .current)) // Thursday, February 15, 2018 at 12:00:00 PM Brasilia Summer Time
}

【讨论】:

  • 您的建议很有帮助。感谢您的帮助。
  • @IdenLim 如果这个答案对您有帮助,那么您应该点击勾选接受它。
  • @IdenLim 它用于遍历数组中的每个元素(在本例中为 NSDate)并获取每个日期的 timeIntervalSinceNow 属性。使用过滤器,我只能从结果中得到正值。排序确保第一个元素是最短时间间隔
  • 很好的答案@LeoDabus!我唯一的问题是,当timeSorted 被初始化并且我根据时间间隔初始化了一个新的Date 对象时,有一个小的时间流逝,它改变了原始日期一点点。我通过在排序和使用Date(timeInterval: interval, since: currentDate) 之前创建currentDate 解决了这个问题。
  • @IrshadQureshi 抱歉,我刚刚看到您的评论,回复晚了。如果您的当前日期时间已经过去,它将仅排除当前日期。在我的示例中,我将所有日期设置为中午 12 点(中午),因此如果我在中午 12 点之后运行此代码,则将排除下午 12 点的当前日期(timeIntervalSinceNow 为负,因为它已经过去了)
猜你喜欢
  • 2016-09-17
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多