Last active
August 6, 2020 15:28
-
-
Save sethi-ishmeet/4614554fdf428c1ca14d3f02797d3e0c to your computer and use it in GitHub Desktop.
Swift repeat rule date calculator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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