objective library jtapplecalendar ios swift calendar

ios - library - jtapplecalendar swift 4



swift 3 cómo obtener la fecha para mañana y ayer(caso especial de atención) nuevo mes o año nuevo (2)

Debe usar la date(byAdding component:) método del calendario date(byAdding component:) para realizar los cálculos de calendario utilizando el mediodía. Al hacerlo, no necesita preocuparse por esos casos especiales:

Swift 3 o más tarde

extension Date { static var yesterday: Date { return Date().dayBefore } static var tomorrow: Date { return Date().dayAfter } var dayBefore: Date { return Calendar.current.date(byAdding: .day, value: -1, to: noon)! } var dayAfter: Date { return Calendar.current.date(byAdding: .day, value: 1, to: noon)! } var noon: Date { return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)! } var month: Int { return Calendar.current.component(.month, from: self) } var isLastDayOfMonth: Bool { return dayAfter.month != month } }

Date.yesterday // "Oct 28, 2018 at 12:00 PM" Date() // "Oct 29, 2018 at 11:01 AM" Date.tomorrow // "Oct 30, 2018 at 12:00 PM" Date.tomorrow.month // 10 Date().isLastDayOfMonth // false

Esta pregunta ya tiene una respuesta aquí:

Estoy trabajando en el calendario de datos para cada mes actual y debo mostrar 3 tipos de cálculo para (ayer - hoy - mañana)

Tengo un bloqueo debido a (índice fuera del límite) para un caso especial como la fecha de hoy (31 de mayo de 2017) y el mes de mayo si intento continuar mi aplicación y comenzar el cálculo mañana, tendré un error (porque debería Conozca su nuevo mes mañana.

Este es mi codigo

class ViewController: UIViewController { var dateComponents: DateComponents! var TimeToday :[String] = [] var TimeTomorrow :[String] = [] var TimeYesterday :[String] = [] override func viewDidLoad() { super.viewDidLoad() let dateDay = Date() let calendar = Calendar(identifier: .gregorian) dateComponents = calendar.dateComponents([.day, .month, .year], from: dateDay) done() } func done() { //------ for tomorrow ------ // month end day 31 if (dateComponents.day! == 30){ if(dateComponents.month! == 1 || dateComponents.month! == 4 || dateComponents.month! == 6 || dateComponents.month! == 7 || dateComponents.month! == 9 || dateComponents.month! == 11 ){ TimeTomorrow.append("/(dateComponents.month!+1)") } // month end day 31 }else if (dateComponents.day! == 31){ if(dateComponents.month! == 3 || dateComponents.month! == 5 || dateComponents.month! == 8 ){ TimeTomorrow.append("/(dateComponents.month!+1)") }else if(dateComponents.month! == 12){ TimeTomorrow.append("/(dateComponents.year!+1)") } // month end day 29 // special case for leap year i donot know how find it //**************************************************** else if (dateComponents.day! == 29){ if(dateComponents.month! == 2 || dateComponents.month! == 10 ){ TimeTomorrow.append("/(dateComponents.month!+1)") } } //------ for yesterday ------ if (dateComponents.month! == 12 || dateComponents.month! == 10 || dateComponents.month! == 8 || dateComponents.month! == 7 || dateComponents.month! == 5 || dateComponents.month! == 2){ var day = dateComponents.date! - 1 //fatal error: unexpectedly found nil while unwrapping an Optional value TimeYesterday.append("/(day)") TimeYesterday.append("30 - /(dateComponents.month! - 1)") }else { ////// } } } }


No sé si esto te ayuda o no, pero recomendaría no hacer los cálculos en NSDateComponents sino en NSDate. Echa un vistazo a https://github.com/malcommac/SwiftDate un cocoapod para saber cómo hacer cosas como llamar tomorrow en un NSDate. Lo bueno de ese pod es que utiliza Regions que ayuda a la internacionalización, donde el día siguiente podría comenzar al atardecer en lugar de a media noche.