2010-09-16 18 views
27

Jest to dość prosta koncepcja, ale jak do tej pory nie byłem w stanie znaleźć eleganckiego (i niezależnego od kalendarza) rozwiązania. Muszę znaleźć pierwszy dzień miesiąca dla arbitralnego NSDate. Na przykład, biorąc pod uwagę arbitralny NSDate (arbitraryDate) inny obiekt NSDate zostanie zwrócony (nazwijmy to firstDayOfMonthDate), który reprezentuje pierwszy dzień miesiąca w arbitraryDate. Komponent czasu nie ma znaczenia, ponieważ potrzebuję obiektu NSDate na pierwszy dzień miesiąca (chociaż dla zachowania porządku byłoby to przydatne, gdyby czas wyzerował się).NSDate dla pierwszego dnia miesiąca

Z góry dziękujemy za wszelką pomoc.

+0

u można wyjaśnić w przykładzie –

+0

chciałbym pełnić funkcję z NSDate przykład 16 września 2010. Funkcja zwraca wówczas inny NSDate która jest pierwszą dzień tego miesiąca. Kontynuując poprzedni przykład, NSDate, który zostanie zwrócony, to 1 września 2010 r. Zdaję sobie sprawę, że istnieją różne alternatywne sposoby osiągnięcia tego wyniku końcowego (podziel pierwotną datę na komponenty, a następnie przebuduj z komponentem dnia będącym 1), ale myślę że musi istnieć bardziej eleganckie rozwiązanie. – Skoota

Odpowiedz

66

Możliwym rozwiązaniem:

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

Dzięki za sugestię. Będzie to jednak działać tylko z kalendarzem gregoriańskim. Czy można ustawić kalendarz jako niezależny od lokalizacji, ponieważ chciałbym, aby aplikacja, którą buduję, działała we wszystkich formatach kalendarza obsługiwanych przez iPhone'a? – Skoota

+9

można użyć [NSCalendar currentCalendar] – diciu

+0

Dzięki mate. Działa idealnie. – 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

wersja 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

podaję się ostatni dzień miesiąca, w przypadku, gdy jest przydatne dla każdego.

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)! 
Powiązane problemy