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í:
- ¿Cómo agrego 1 día a un NSDate? 25 respuestas
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.