Skip to content

Instantly share code, notes, and snippets.

@sethi-ishmeet
Last active August 6, 2020 15:28
Show Gist options
  • Save sethi-ishmeet/4614554fdf428c1ca14d3f02797d3e0c to your computer and use it in GitHub Desktop.
Save sethi-ishmeet/4614554fdf428c1ca14d3f02797d3e0c to your computer and use it in GitHub Desktop.
Swift repeat rule date calculator
// based on: http://stackoverflow.com/a/31598663/234609
// Original gist: https://gist.github.com/jim-rhoades/ea0c5b241ec77a37f86b
// (paste this into an Xcode playground for testing)
import UIKit
let currentCalendar = Calendar.current
var dateComponents = DateComponents()
dateComponents.day = 31
dateComponents.month = 1
dateComponents.year = 2015
guard let pastDate = currentCalendar.date(from: dateComponents) else {
fatalError("failed to create NSDate")
}
var optionalNow: Date? = Date()
// assume "now" is March 15, 2015
// or comment this out to test using the current date/time
let marchDateComponents = DateComponents()
dateComponents.day = 15
dateComponents.month = 3
dateComponents.year = 2015
optionalNow = currentCalendar.date(from: dateComponents)
guard let now = optionalNow else {
fatalError("optionalNow was nil")
}
let repeatUnit = Calendar.Component.month
let repeatInterval = 3
var deltaComponents = currentCalendar.dateComponents([repeatUnit], from: pastDate, to: now)
let deltaValue = deltaComponents.value(for: repeatUnit)!
// MODIFIED VERSION
let repeatsToNowPlusOne = deltaValue - (deltaValue % repeatInterval) + repeatInterval
var nextDateComponents = DateComponents()
nextDateComponents.setValue(repeatsToNowPlusOne, for: repeatUnit)
let nextDate = currentCalendar.date(byAdding: nextDateComponents, to: pastDate)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment