2013-02-28 7 views
7

Ich habe diese Teilmenge einer Methode, die Tag eins des aktuellen Monats erhalten muss.Erhalten ersten Tag in einem Monat von NSCalendar

NSDate *today = [NSDate date]; // returns correctly 28 february 2013 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.day = 1; 
NSDate *dayOneInCurrentMonth = [gregorian dateByAddingComponents:components toDate:today options:0]; 

dayOneInCurrentMonth druckt dann 2013-03-01 09:53:49 +0000 heraus, den ersten Tag des nächsten Monats.

Wie bekomme ich den ersten Tag des aktuellen Monats?

Antwort

16

Ihre Logik ist falsch: Anstatt den Tag des Datums auf 1 zu setzen, fügen Sie dem aktuellen Datum einen Tag hinzu.

versuchen, etwas wie folgt aus:

NSDate *today = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *components = [gregorian components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:today]; 
components.day = 1; 

NSDate *dayOneInCurrentMonth = [gregorian dateFromComponents:components]; 
+0

Natürlich zu bekommen! Der Methodenname wurde falsch gelesen. Vielen Dank! Antwort wird akzeptiert :-) – hakonbogen

+2

Ok, @Fabian Kreiser, Ich habe den Code verwendet wie es ist und es gibt mir das Ergebnis: '2015-05-31 21:00:00 UTC'. Heute ist "2015-06-08 8: 36". Es gibt nicht den ersten Tag, sondern den letzten Monat zurück? – new2ios

1

Sie wollen [NSCalender dateFromComponents:] statt:

NSDate *dayOneInCurrentMonth = [gregorian dateFromComponents:components]; 
1

einfache Art und Weise von einem bestimmten Zeitpunkt an den ersten bekommen:

NSDate *first = [gregorian dateBySettingUnit:NSCalendarUnitDay value:1 ofDate:date options:0]; 
1

einfache Weg zu erstes und letztes Datum des vorherigen Monats ist:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]]; 

//TO GET PREVIOUS MONTH LAST DAY 
[comp setMonth:[comp month]]; 
[comp setDay:1]; 
NSDate *tDateMonth = [gregorian dateFromComponents:comp]; 
NSLog(@"LAST DAY OF PREVIOUS MONTH ; %@", tDateMonth); 

//TO GET PREVIOUS MONTH FIRST DAY 
[comp setMonth:[comp month]-1]; 
[comp setDay:3]; 
NSDate *td = [gregorian dateFromComponents:comp]; 
NSLog(@"FIRST DAY OF PREVIOUS MONTH ; %@", td); 

Hope this

hilft
0

Durch neue Variable Erstellung auf Speichernutzung teuer ist, ist es besser, mit Datum Formatierer den ersten Tag des aktuellen Monats

today = [NSDate date]; 

firstDayDateFormatter = [[NSDateFormatter alloc] init]; 
[firstDayDateFormatter setDateFormat:@"01-MM-yyyy"]; 
dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"dd-MM-yyyy"]; 
[dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US"]]; 
firstDayOfTheMonth = [mdfDateFormat dateFromString:[firstDayDateFormatter stringFromDate:today]]; 
0
NSDate *startDate = nil; 
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitMonth startDate:&startDate interval:NULL forDate:date]; 

return startDate;