0

I want to create a project where:

  1. I create a task to do.
  2. I create a stoping date for this task
  3. I create three reminders using date picker

This I've done already. But now, I want the label to return for me the hour of the closest reminder (but I want the label to do this until the stoping date)

What I accomplish already is a playground project:

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!))
}
}

How to get only hours from first/second/thirdDate and display the hour from those three dates that is the closest to currentDate hour? And perfectly finish displaying it after currentDate exceeds stopDoingDate...

I came up with something like this (code below). Can anyone look at it and tell me if there is some way I can simplify this?

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")
}
mdmb
  • 4,833
  • 7
  • 42
  • 90

1 Answers1

0

I came up with this: The only problem is to generate array of dates from currentDate to stopDoingDate but I will handle this alone (and probably post a solution here as well)

I used one of this forum post to generate extension to 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")
}

This forum is truly awesome! Thanks Leo Dabus for the simple idea!

mdmb
  • 4,833
  • 7
  • 42
  • 90