2010-09-16 8 views
27

Ceci est un concept assez simple, mais pour le moment, je n'ai pas réussi à trouver une solution élégante (et indépendante des paramètres de calendrier). Je dois trouver le premier jour du mois pour un NSDate arbitraire. Par exemple, étant donné un NSDate arbitraire (arbitraryDate) un autre objet NSDate sera renvoyé (appelons ceci firstDayOfMonthDate) qui représente le premier jour du mois dans arbitraryDate. Le composant temps n'a pas d'importance, car j'ai juste besoin de l'objet NSDate pour le premier jour du mois (bien que pour la netteté, il serait utile que le temps soit juste remis à zéro).NSDate pour le premier jour du mois

Merci d'avance pour toute assistance.

+0

u peut l'expliquer par exemple –

+0

je voudrais fournir une fonction avec un NSDate tel que 16 Septembre 2010. La fonction serait alors retourner une autre NSDate qui est le premier jour de ce mois. Poursuivant l'exemple précédent, le NSDate qui serait retourné est le 1er septembre 2010. Je me rends compte qu'il existe différentes manières d'accomplir ce résultat final (diviser la date d'origine en composants, puis reconstruire avec le composant de jour étant 1) mais je pense qu'il doit y avoir une solution plus élégante. – Skoota

Répondre

66

Une solution possible:

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

Merci pour votre suggestion. Cependant, cela ne fonctionnera qu'avec le calendrier grégorien. Est-il possible de le rendre indépendant des paramètres régionaux/de format, comme je voudrais que l'application que je construis fonctionne dans tous les formats de calendrier supportés sur l'iPhone? – Skoota

+9

vous pouvez utiliser [NSCalendar currentCalendar] – diciu

+0

Merci compagnon. Travailler parfaitement. – 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

Version 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

J'ai inclus obtenir le dernier jour du mois au cas où il est utile à tous.

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