2013-02-28 14 views
7

Ho questo sottoinsieme di un metodo che deve ottenere il giorno uno del mese corrente.Ottenere il primo giorno in un mese da 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 quindi stampa 2013-03-01 09:53:49 +0000, il primo giorno del mese successivo.

Come si ottiene il primo giorno del mese corrente?

risposta

16

La tua logica è sbagliata: invece di impostare il giorno della data su 1, stai aggiungendo un giorno alla data corrente.

provare qualcosa di simile:

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

Certo! Non ha letto il nome del metodo. Grazie! Accetterà risposta :-) – hakonbogen

+2

Ok, @Fabian Kreiser, ho usato il codice così com'è e mi dà risultato: '2015-05-31 21:00:00 UTC'. Oggi è il 2015-06-08 8: 36'. Non restituisce il primo giorno, ma l'ultimo del mese precedente? – new2ios

1

Volete [NSCalender dateFromComponents:] invece:

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

modo semplice di arrivare al primo da una certa data:

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

Facile modo per il primo e l'ultimo mese del mese precedente sono:

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

Spero che questo aiuti

0

Con la creazione di nuova variabile è costoso l'utilizzo della memoria, è meglio con data di formattazione per ottenere il primo giorno del mese corrente

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;