2016-01-03 2 views
0

Я хочу создать проект, где:NSDate - Возвращение ближайшего часа

  1. создать задачу сделать.
  2. создать дату останавливая для выполнения этой задачи
  3. создать три напоминания с помощью выбора даты

Это я сделал уже. Но теперь, я хочу, чтобы метка, чтобы вернуть мне час ближайшего напоминания (но я хочу, чтобы метка не сделать это до даты останавливая)

Что я выполняю уже есть площадка проект:

let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" 
let currentDate = dateFormatter.dateFromString("2016-01-03 16:30") 

var firstDate = dateFormatter.dateFromString("2016-01-03 13:00") 
var secondDate = dateFormatter.dateFromString("2016-01-03 16:00") 
var thirdDate = dateFormatter.dateFromString("2016-01-03 17:00") 
var datesArray = [firstDate, secondDate, thirdDate] 


let firstInterval = firstDate?.timeIntervalSinceDate(currentDate!) 
let secondInterval = secondDate?.timeIntervalSinceDate(currentDate!) 
let thirdInterval = thirdDate?.timeIntervalSinceDate(currentDate!) 
let intervalArray = [firstInterval, secondInterval, thirdInterval] 


var aboveZeroIntervals = [NSTimeInterval]() 
for interval in intervalArray { 
if interval > 0 { 
    aboveZeroIntervals.append(interval!) 
} 
} 
//print(aboveZeroIntervals) 

for date in datesArray { 
if date?.timeIntervalSinceDate(currentDate!) == aboveZeroIntervals.minElement() { 
    print(dateFormatter.stringFromDate(date!)) 
} 
} 

Как получить только часы с первой/второй/третьей даты и отобразить час с тех трех дат, которые наиболее близки к текущему часу? И отлично закончите отображение его после того, как currentDate превысит stopDoingDate ...

Я придумал что-то вроде этого (код ниже). Может ли кто-нибудь взглянуть на него и сказать, есть ли способ упростить это?

extension NSDate 
{ 
func isGreaterThanDate(dateToCompare : NSDate) -> Bool 
{ 
    //Declare Variables 
    var isGreater = false 

    //Compare Values 
    if self.compare(dateToCompare) == NSComparisonResult.OrderedDescending 
    { 
     isGreater = true 
    } 

    //Return Result 
    return isGreater 
} 
} 

let calendar = NSCalendar.currentCalendar() 
let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" 
let currentDate = dateFormatter.dateFromString("2016-01-04 16:30") 
let stopDoingDate = dateFormatter.dateFromString("2016-01-06 15:00") 


if stopDoingDate!.isGreaterThanDate(currentDate!) { 
let currentDateComponents = calendar.components([.Year, .Month, .Day, .Hour, .Minute], fromDate: currentDate!) 
currentDateComponents.hour 
currentDateComponents.minute 
let dateTimeFormatter = NSDateFormatter() 
dateTimeFormatter.dateFormat = "HH:mm" 
let currentOnlyTime = dateTimeFormatter.dateFromString("\(currentDateComponents.hour):\(currentDateComponents.minute)") 

var firstDate = dateFormatter.dateFromString("2016-01-03 13:00") 
var firstDateComponents = calendar.components([.Hour, .Minute], fromDate: firstDate!) 
var firstDateTime = dateTimeFormatter.dateFromString("\(firstDateComponents.hour):\(firstDateComponents.minute)") 

var secondDate = dateFormatter.dateFromString("2016-01-03 16:00") 
var secondDateComponents = calendar.components([.Hour, .Minute], fromDate: secondDate!) 
var secondDateTime = dateTimeFormatter.dateFromString("\(secondDateComponents.hour):\(secondDateComponents.minute)") 

var thirdDate = dateFormatter.dateFromString("2016-01-03 17:00") 
var thirdDateComponents = calendar.components([.Hour, .Minute], fromDate: thirdDate!) 
var thirdDateTime = dateTimeFormatter.dateFromString("\(thirdDateComponents.hour):\(thirdDateComponents.minute)") 

var datesArray = [firstDateTime, secondDateTime, thirdDateTime] 


let firstInterval = firstDateTime?.timeIntervalSinceDate(currentOnlyTime!) 
let secondInterval = secondDateTime?.timeIntervalSinceDate(currentOnlyTime!) 
let thirdInterval = thirdDateTime?.timeIntervalSinceDate(currentOnlyTime!) 
let intervalArray = [firstInterval, secondInterval, thirdInterval] 


var aboveZeroIntervals = [NSTimeInterval]() 
for interval in intervalArray { 
    if interval > 0 { 
     aboveZeroIntervals.append(interval!) 
    } 
} 
//print(aboveZeroIntervals) 
for date in datesArray { 
    if date?.timeIntervalSinceDate(currentOnlyTime!) == aboveZeroIntervals.minElement() { 
     let dateTime = calendar.components([.Hour, .Minute], fromDate: date!) 

     print(dateFormatter.dateFromString("\(currentDateComponents.year)-\(currentDateComponents.month)-\(currentDateComponents.day) \(dateTime.hour):\(dateTime.minute)")!) 
     print("Next todo hour is: \(dateTime.hour): \(dateTime.minute)") 

    } 
} 
} else { 
print("Todo DONE") 
} 
+0

Просто отсортируйте даты отсортированные по возрастанию и получите первый элемент –

+0

Чтобы получить часовую составляющую с вашей даты, выберите этот ответ http://stackoverflow.com/a/27913764/2303865 –

ответ

0

Я пришел с этим: Единственная проблема заключается в создании массива дат из CurrentDate в stopDoingDate, но я справиться с этим в одиночку (и, возможно, опубликовать решение здесь, а)

Я использовал один этой публикации для создания продления до NSDate:

extension NSDate 
{ 
    func isGreaterThanDate(dateToCompare : NSDate) -> Bool 
    { 
     //Declare Variables 
     var isGreater = false 

     //Compare Values 
     if self.compare(dateToCompare) == NSComparisonResult.OrderedDescending 
     { 
      isGreater = true 
     } 

     //Return Result 
     return isGreater 
    } 
} 

//let calendar = NSCalendar.currentCalendar() 
let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" 
let currentDate = dateFormatter.dateFromString("2016-01-04 14:00")! 
let stopDoingDate = dateFormatter.dateFromString("2016-01-06 16:00")! 
let date1 = dateFormatter.dateFromString("2016-01-04 09:00") 
let date2 = dateFormatter.dateFromString("2016-01-04 15:00") 
let date3 = dateFormatter.dateFromString("2016-01-05 09:00") 
let date4 = dateFormatter.dateFromString("2016-01-05 15:00") 
let date5 = dateFormatter.dateFromString("2016-01-06 09:00") 
let date6 = dateFormatter.dateFromString("2016-01-06 15:00") 
var dates: [NSDate] = [date1!, date2!, date3!, date6!, date5!, date4!] 

if stopDoingDate.isGreaterThanDate(currentDate) { 
    var datesAfterCurrentDate = [NSDate]() 
    for date in dates { 
     if date.isGreaterThanDate(currentDate) { 
      datesAfterCurrentDate.append(date) 
     } 
    } 
    let sortedDatesAfterCurrentDate = datesAfterCurrentDate.sort({ $0.timeIntervalSince1970 < $1.timeIntervalSince1970 }) 
    let dateToDisplay = sortedDatesAfterCurrentDate.first! 
    let timeFormatter = NSDateFormatter() 
    timeFormatter.timeStyle = .ShortStyle 
    print(timeFormatter.stringFromDate(dateToDisplay)) } else { 
    print("We are done here") 
} 

Этот форум действительно потрясающий! Спасибо Лео Дабусу за простую идею!