iphone cocoa-touch nsdate nscalendar

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]]);