2015-01-24 1 views
4

Здравствуйте, у меня есть метод, который возвращает массив раз за каждый день.Итерация в течение года, чтобы каждый день NSDate-объект в Swift

prayTimesDate(date: NSDate, latitide : Double, longitude : Double, timeZone : Double) -> NSMutableArray 

Мне нужно пройти через целый год или, возможно, диапазон дат, чтобы получить массив раз за каждый день в течение целого года. Я нашел много ссылок в ruby ​​и python о том, как это сделать, но я не мог найти ничего для быстрой или объективной c. Есть ли встроенные методы в быстром, что это выполнит? Если нет, кто-то может мне помочь, поскольку я все еще новичок в программировании. Любой вход очень приветствуется.

Это Objective-C код для метода я ссылка на мой стремительный проект

- (NSMutableArray *)prayerTimesDate:(NSDate *)date latitude:(double)latitude longitude:(double)longitude andTimezone:(double)timezone 
{ 
    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *components = [calendar components:unitFlags fromDate:date]; 

    NSInteger year = [components year]; 
    NSInteger month = [components month]; 
    NSInteger day = [components day]; 

    return [self getDatePrayerTimesForYear:year month:month day:day latitude:latitude longitude:longitude andtimeZone:timezone]; 
} 
+0

Какой код в настоящее время в вашем методе prayTimesDate? –

+0

@ Lyndsey Scott Я только что обновил свой вопрос – gnm1978

+0

, чтобы прояснить мой вопрос. Мне просто нужен способ повторения с текущего дня до года, когда пользователь открывает приложение, поэтому я могу обновить таблицы времени молитвы. – gnm1978

ответ

5

Предполагая, что ваш метод prayerTimesDate: уже возвращенный ожидаемый результат, вы можете перебрать каждый день года, а неоднократно называете prayerTimesDate: получить массив, содержащее время молитвы на каждый день, например:

func yearlyPrayerDatesFromCurrentDate (latitude:Double, longitude:Double, timezone:Double) -> NSMutableArray { 

    // Set "date" to equal the current day 
    var date:NSDate! = NSDate() 

    // Increment "date" by one year to calculate the ending 
    // date for the loop 
    let gregorian:NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) 
    let dateComponents = NSDateComponents() 
    dateComponents.year = 1 
    let endingDate:NSDate! = gregorian.dateByAddingComponents(dateComponents, toDate: date, options: nil) 

    // Create an array to hold *all* the returned 
    // results for the year 
    var datesArray = NSMutableArray() 

    // Loop through each date until the ending date is 
    // reached 
    while date.compare(endingDate) != NSComparisonResult.OrderedDescending { 
     // Call your prayerTimesDate: method on the current 
     // date to get that date's prayer times and add the 
     // times from the returned array to the datesArray 
     datesArray.addObjectsFromArray(prayerTimesDate(date, latitude: latitude, longitude: longitude, andTimezone: timezone)) 

     // increment the date by 1 day 
     let dateComponents = NSDateComponents() 
     dateComponents.day = 1 
     date = gregorian.dateByAddingComponents(dateComponents, toDate: date, options: nil) 
    } 

    return datesArray 
} 
+0

ok, поэтому я только что отредактировал код dateArray.addObject, а не addObjectsFormArray, поэтому я могу иметь каждую дату в своем собственном отдельном массиве, тогда я добавил датыArray.addObject (date), чтобы у меня была дата для определения каждого массива. Но первая дата всегда на один день вперед.01/25/2015 – gnm1978

+0

Я даже добавил дату перед циклом while, чтобы получить текущую дату, а затем я добавил ее снова в цикле while после добавления addObjects – gnm1978

+0

@GhassanMohammed. В настоящее время он составляет 1/25/2015 в часовой пояс GMT, и это часовой пояс для любого объекта NSDate. –

0

Создания NSDateComponents экземпляра на 1 день и NSDate объектов каждый раз, когда в первый день. Теперь вы можете перебирать количество дней, которое вы хотите (или пока вы не нажмете на дату окончания), а затем вы можете использовать dateByAddingComponents:toDate:options: календаря, чтобы получить новую дату для каждого дня.

2

Здесь Еще один пример на срок более 14 дней (без NSCalendar):

let ti:NSTimeInterval = 24*60*60 //one day 
let dateFrom = NSDate() //Now 
let dateTo = dateFrom.dateByAddingTimeInterval(24*60*60*14) //14 Days later 

var nextDate = NSDate() 
var endDate = dateTo.dateByAddingTimeInterval(ti) 

while nextDate.compare(endDate) == NSComparisonResult.OrderedAscending 
{  
    print("nextDate:", nextDate) 
    nextDate = nextDate.dateByAddingTimeInterval(ti) 
} 
+0

из-за дневного времени суток не обязательно 24 часа. они могут быть 23, 24 или 25 часов. поскольку последний результат используется для вычисления следующего, ошибка будет не только через 2 дня в году, но и до половины. – vikingosegundo

+0

a должен видеть для каждого разработчика iOS/macOS: [WWDC11: Выполнение расчётов календаря] (https://developer.apple.com/videos/play/wwdc2011/117/) – vikingosegundo

0

от Apple, док: для того, чтобы вычислить последовательность дат, используйте enumerateDatesStartingAfterDate: matchingComponents: варианты: usingBlock: метод вместо кала используя этот метод (- nextDateAfterDate: matchingComponents: options:) в цикле с результатом предыдущей итерации цикла.

Как я получил, это будет перебирать все даты, совпадающие с «matchingComponents» до завершения итерации с «stop.memory = True»

//: Playground - noun: a place where people can play 

import UIKit 

let calendar = NSCalendar.currentCalendar() 
let startDate = calendar.startOfDayForDate(NSDate()) 
let finishDate = calendar.dateByAddingUnit(.Day, value: 10, toDate: startDate, options: []) 
let dayComponent = NSDateComponents() 
dayComponent.hour = 1 

calendar.enumerateDatesStartingAfterDate(startDate, matchingComponents: dayComponent, options: [.MatchStrictly]) { (date, exactMatch, stop) in 
    print(date) 
    if date!.compare(finishDate!) == NSComparisonResult.OrderedDescending { 
     // .memory gets at the value of an UnsafeMutablePointer 
     stop.memory = true 
    } 
}