比较没有日期的时间swift3

时间:2017-05-13 20:33:31

标签: swift date nsdateformatter

我正在使用API​​来获取一天五次的列表,作为没有日期的(AM,PM)格式的字符串,

(“4:30 AM”,“1:00 PM”,“3:20 PM”,“6:40 PM”,“9:10 PM”)

我要做的是显示下一次在屏幕上取决于iPhone上的当前时间

所以,如果现在的时间是下午5:00,则屏幕上显示的时间是下午6:40

如何在没有包含日期​​的情况下比较swift中的时间,因为我试图将时间列表转换为日期类型但不幸的是我在2001年获取日期和日期显示,所以即使我尝试比较日期也会给出我错了结果

 print(self._praytime.arraytime)




            for Dates in self._praytime.arraytime {
                let dateformatters = DateFormatter()
                dateformatters.dateStyle = .none
                dateformatters.timeStyle = .short
                let xxbbs = dateformatters.date(from: Dates)
                print(xxbbs!)
            }

在我得到时间之后我把它放在数组中我试图执行代码上面所以我可以得到没有日期的时间但是在输出屏幕中显示的是这个

Optional(2000-01-01 11:14:00 +0000)
Optional(2000-01-01 20:06:00 +0000)
Optional(1999-12-31 23:57:00 +0000)
Optional(2000-01-01 03:11:00 +0000)
Optional(2000-01-01 04:41:00 +0000)

任何想法如何解决这个问题,如果有任何其他简单的方法来完成这项任务我很高兴听到它

谢谢大家

1 个答案:

答案 0 :(得分:1)

使用DateComponents

的建议
  • 假设这个给定的数组

    let times = ["4:30 AM","1:00 PM","3:20 PM","6:40 PM","9:10 PM"]
    
  • 创建与格式

    匹配的日期格式化程序
    let formatter = DateFormatter()
    formatter.dateFormat = "h:mm a"
    
  • 仅考虑DateDateComponents

    ,将时间字符串映射到hour并立即映射到minute
    let dateArray = times.map { Calendar.current.dateComponents([.hour, .minute], from:formatter.date(from:$0)!) }
    
  • 将此数组映射到现在分别与组件匹配的下一个日期

    let upcomingDates = dateArray.map { Calendar.current.nextDate(after: Date(), matching: $0, matchingPolicy: .nextTime)!  }
    
  • 对数组进行升序排序,第一项是您要查找的日期

    let nextDate = upcomingDates.sorted().first!
    
  • 使用格式化程序将日期转换回时间字符串

    print(formatter.string(from:nextDate))