iphone - NSDate para el primer día del mes
cocoa-touch nscalendar (5)
Este es un concepto bastante simple, pero hasta ahora no he podido encontrar una solución elegante (e independiente del calendario local). Necesito encontrar el primer día del mes para un NSDate
arbitrario. Por ejemplo, dado un NSDate
arbitrario ( arbitraryDate
) se devolverá otro objeto NSDate (llamemos a este firstDayOfMonthDate
) que representa el primer día del mes en arbitraryDate
. El componente de tiempo no importa, ya que solo necesito el objeto NSDate para el primer día del mes (aunque para la limpieza sería útil si el tiempo se redujera a cero).
Gracias de antemano por cualquier ayuda.
Swift 3:
let calendar = Calendar.current
var comps = calendar.dateComponents([.year, .month], from: date)
comps.setValue(1, for: .day)
let firstDayOfMonth = calendar.date(from: comps)!
// I tried this, but it doesn''t work, why?
// let firstDayOfMonth = calendar.date(bySetting: .day, value: 1, of: date)!
Una posible solución:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *arbitraryDate = [NSDate date];
NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:arbitraryDate];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp];
Versión rápida
let arbitraryDate:NSDate = NSDate()
let calendar:NSCalendar = NSCalendar.currentCalendar()
let components:NSDateComponents = calendar.components([.Year, .Month, .Day], fromDate: arbitraryDate)
components.setValue(1, forComponent: .Day)
let firstDayOfMonthDate = calendar.dateFromComponents(components)
Swift 3
He incluido el último día del mes en caso de que sea útil para alguien.
extension Date {
func lastDayOfMonth() -> Date {
let calendar = Calendar.current
let dayRange = calendar.range(of: .day, in: .month, for: self)
let dayCount = dayRange!.count
var comp = calendar.dateComponents([.year, .month, .day], from: self)
comp.day = dayCount
return calendar.date(from: comp)!
}
func firstDayOfMonth() -> Date {
let calendar: Calendar = Calendar.current
var components: DateComponents = calendar.dateComponents([.year, .month, .day], from: self)
components.setValue(1, for: .day)
return calendar.date(from: components)!
}
}
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
fromDate:[NSDate date]];
components.day = 1;
NSDate *firstDayOfMonthDate = [[NSCalendar currentCalendar] dateFromComponents: components];
NSLog(@"First day of month: %@", [firstDayOfMonthDate descriptionWithLocale:[NSLocale currentLocale]]);