2010-01-17 12 views

risposta

72

Prova questo:

NSCalendar *gregorian = 
    [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSUInteger dayOfYear = 
    [gregorian ordinalityOfUnit:NSDayCalendarUnit 
    inUnit:NSYearCalendarUnit forDate:[NSDate date]]; 
[gregorian release]; 
return dayOfYear; 

dove date è la data che si desidera determinare il giorno dell'anno per. La documentazione sul metodo NSCalendar.ordinalityOfUnit è here.

+0

wow, questo potrebbe semplificare le cose, è quasi una risposta alla mia altra domanda, http://stackoverflow.com/questions/2078372/ Probabilmente una migliore :) – Godisemo

-2

Con la classe NSDate. Utilizzare il messaggio timeIntervalSinceDate. Ti restituirà un valore NSTimeInterval (in realtà è un doppio) che rappresenta i secondi trascorsi dalla data desiderata. Dopodiché, è facile convertire da un giorno all'altro.

Se si tronca seconds/86400, si ottengono giorni.

Diciamo che si desidera giorni dal 1 ° gennaio 2010.

// current date/time 
NSDate *now = [[NSData alloc] init]; 

// seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now 
NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]]; 

// days since January 1st 2010 00:00:00 (GMT -4) until now 
int days = (int)interval/86400; 
+0

Non dimenticare di aggiungere uno, come il valore che si ottiene è base zero. – Guffa

+1

Il problema è che dovrai verificare l'anno per ogni data prima di poter calcolare. Non vuoi che il 1 gennaio 2011 diventi il ​​366 ° giorno dell'anno – Godisemo

+0

Come dice Godisemo, non puoi contare su costanti grandi per calcolare i giorni. E per quanto riguarda i secondi bisestili? O anni bizzarri nel lontano passato che mancano intere settimane di giorni? –

6

Quindi la soluzione mi è venuta è abbastanza pulito e semplice e non in alcun modo complicato.

Il trucco qui che ho impiegato così tanto tempo per capire era usare NSDateFormatter. La "D" è la bandiera per il giorno dell'anno.

Spero che questo sia stato utile a voi che hanno lo stesso problema che avevo.

+0

Una soluzione accurata, ma non la più accurata. ;) Penso che ti sia un po 'bloccato nel pensare alle date in unità di anni, mesi e giorni invece che come una linea temporale continua. Le date vengono spesso memorizzate come secondi trascorsi (o giorni o millisecondi o 1/10000000 secondi) da una data impostata, un formato che rende molto facile ottenere la differenza dall'inizio dell'anno alla data specifica. – Guffa

+0

vero, questa è la cosa difficile quando si risolvono i problemi. Rimani bloccato in un approccio e non riesci a pensare a alternative. Grazie – Godisemo

+0

Come utilizzare questo metodo per ottenere il giorno islamico dell'anno? –

2

Utilizzando ARC e la sostituzione di simboli deprecati, la risposta di John Feminella sarebbe simile a questa:

NSCalendar *greg = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; 
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]]; 
Problemi correlati