2010-09-16 22 views
27

Este es un concepto bastante simple, pero hasta ahora no he podido encontrar una solución elegante (e independiente de la configuración regional del calendario). Necesito encontrar el primer día del mes para un arbitrario NSDate. Por ejemplo, dado un arbitrario NSDate (arbitraryDate) se devolverá otro objeto NSDate (llamemos a esto 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 mayor nitidez sería útil si el tiempo se acabara de cero).NSDate para el primer día del mes

Gracias de antemano por su asistencia.

+0

u puede explicar con el ejemplo –

+0

me gustaría ofrecer una función con un NSDate tales como 16 de septiembre de 2010. La función sería luego regresar otra NSDate que es el primer día de ese mes. Continuando con el ejemplo anterior, el NSDate que se devolverá es el 1 de septiembre de 2010. Me doy cuenta de que hay varias formas alternativas de lograr este resultado final (dividir la fecha original en componentes, luego reconstruir con el componente de día siendo 1) pero estoy pensando que debe haber una solución más elegante. – Skoota

Respuesta

66

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]; 
+0

Gracias por su sugerencia. Sin embargo, esto solo funcionará con el calendario gregoriano. ¿Es posible hacer que el calendario sea independiente de la configuración regional, ya que me gustaría que la aplicación que estoy construyendo funcione en todos los formatos de calendario admitidos en el iPhone? – Skoota

+9

puede usar [NSCalendar currentCalendar] – diciu

+0

Gracias amigo. Funcionando perfectamente – Skoota

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

versión Swift

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) 
4

Swift 3

He incluido conseguir el último día del mes en el caso de que sea útil para todos.

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)! 
    } 
} 
0

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)! 
Cuestiones relacionadas