2010-09-16 4 views
27

Dies ist ein ziemlich einfaches Konzept, aber bis jetzt konnte ich keine elegante (und Kalender Locale unabhängige) Lösung finden. Ich muss den ersten Tag des Monats für einen beliebigen NSDate finden. Zum Beispiel wird bei einem beliebigen NSDate (arbitraryDate) ein weiteres NSDate-Objekt zurückgegeben (nennen wir das firstDayOfMonthDate), das den ersten Tag des Monats in arbitraryDate darstellt. Die Zeitkomponente spielt keine Rolle, da ich nur das NSDate-Objekt für den ersten Tag des Monats benötige (obwohl es für die Ordentlichkeit nützlich wäre, wenn die Zeit gerade auf Null gesetzt würde).NSDate für den ersten Tag des Monats

Vielen Dank im Voraus für jede Hilfe.

+0

u kann es erklären, mit Beispiel –

+0

Ich möchte eine Funktion mit einem NSDate wie 16 September 2010 dann eine andere NSDate zurück, die die erste ist, würde die Funktion zur Verfügung zu stellen Tag des Monats. In Fortsetzung des vorherigen Beispiels ist das NSDate, das zurückgegeben wurde, der 1. September 2010. Mir ist klar, dass es verschiedene alternative Möglichkeiten gibt, um dieses Endergebnis zu erreichen (das ursprüngliche Datum in Komponenten aufteilen, dann mit der Tageskomponente 1), aber ich denke nach dass es eine elegantere Lösung geben muss. – Skoota

Antwort

66

Eine mögliche Lösung:

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

Danke für Ihren Vorschlag. Dies funktioniert jedoch nur mit dem Gregorianischen Kalender. Ist es möglich, den Kalender orts-/formatunabhängig zu gestalten, da ich möchte, dass die App, die ich erstelle, über alle vom iPhone unterstützten Kalenderformate hinweg funktioniert? – Skoota

+9

können Sie [NSCalendar currentCalendar] verwenden – diciu

+0

Danke mate. Perfekt funktioniert. – 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

Swift Version

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

ich eingeschlossen habe den letzten Tag des Monats, in dem Fall bekommen es ist nützlich für jeden.

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