2012-06-21 9 views
11

Ho bisogno di ottenere un oggetto NSDate per 00:00 (inizio giornata) da [data NSDate], diciamo se al momento sono le 11:30 (restituite da [data NSDate]), il 01/06/2012, ora ho bisogno di avere un NSDate per le 00:00 del 01/06/2012.Come ottenere NSDate per 00:00 del giorno di [Data NSDate]?

Non ho provato questo, ma ciò che è nella mia mente è:

NSDate *now = [NSDate date]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now]; 
[components setHour:0]; 
[components setMinute:0]; 
[components setSecond:0]; 
NSDate *morningStart = [calendar dateFromComponents:components]; 

Così ho prima ottenere la data corrente (dicono che sia 01/06/2012), e costruire una NSDateComponent per la data , quindi ho impostato l'ora/minuto/secondo su 0 e l'anno/mese/giorno non deve essere modificato (ad esempio 01/06/2012), quindi creo un NSDate per questa impostazione del componente e posso ottenere una data di 00:00 : 00 01/06/2012?

+0

Controllare la risposta da poozolax. È molto meglio e corretto al 100%! – iWheelBuy

risposta

9

Che cosa stai facendo è corretto, ma quando si NSLog morningStart la data verrà visualizzata nel fuso orario GMT

Se si vuole fare in modo che la data è corretta, convertirlo in NSString

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"yyyy-MMM-dd HH:mm:ss"]; 
NSString *strFromDate = [formatter stringFromDate:morningStart]; // this will return 2012-Jun-21 00:00:00 
+0

Grazie per la tua risposta, ma qual è la differenza? Ho solo bisogno di NSDate, non di una stringa di NSDate. La differenza – hzxu

+0

non influisce sulla tua applicazione, NSDate ogni volta che viene Registrato lo registrerà nel fuso orario GMT, ho aggiunto l'NSString solo per mostrare che la tua data è corretta, tuttavia la tua data di inizio mattinata è corretta al 100% e contiene la data in cui effettivamente voglio :) –

+0

OK, grazie mille! – hzxu

5

La conversione da NSDate a NSString può essere utile, ma se è necessario mantenere un oggetto NSDate per un'ulteriore elaborazione, ecco la soluzione per far sì che il proprio oggetto MorningStart NSDate sia impostato alle 00:00:00, con attenzione anche al fuso orario ... Come vedrai, non sei così lontano dalla soluzione:

NSDate *now = [NSDate date]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:now]; 
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 
int timeZoneOffset = [destinationTimeZone secondsFromGMTForDate:now]/3600; 
[components setHour:timeZoneOffset]; 
[components setMinute:0]; 
[components setSecond:0]; 
NSDate *morningStart = [calendar dateFromComponents:components]; 
+0

fantastico! molte grazie! – iWheelBuy

2

E 'molto facile da fare questo in iOS 8 utilizzando startOfDayForDate:

let date = NSDate() 
let calendar = NSCalendar.currentCalendar(calendarIdentifier: NSGregorianCalendar) 
let dateAtStartOfDay = calendar.startOfDayForDate(date) 

o si può farlo in modo tradizionale a Swift come segue:

let date = NSDate() 
let calendar = NSCalendar.currentCalendar(calendarIdentifier: NSGregorianCalendar) 
// Use a mask to extract the required components from today's date 
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: date) 
let dateAtStartOfDay = calendar.dateFromComponents(components)! 
print(dateAtStartOfDay) 

(Nota: NSDates sono memorizzati rispetto al GMT. Quindi print visualizzerà l'ora locale relativa. Una chiara comprensione di TimeZone è essenziale per utilizzare correttamente NSDates.)