2012-06-21 10 views
11

Necesito obtener un objeto NSDate para las 00:00 (comienzo del día) a partir de [NSDate date], digamos si actualmente son las 11:30 a.m. (devuelto el [NSDate date]), el 01/06/2012, ahora necesito tener un NSDate para 00:00 am el 01/06/2012.¿Cómo obtener NSDate para las 00:00 del día de [NSDate date]?

No he probado esto, pero lo que está en mi mente es:

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

Así que primero consigue la fecha actual (dicen que es 01/06/2012), y construir un NSDateComponent de la fecha , luego establezco hora/minuto/segundo en 0 y el año/mes/día no debe cambiarse (es decir, 01/06/2012) luego creo un NSDate para esta configuración de componente y puedo obtener una fecha de 00:00 : 00 01/06/2012?

+0

Compruebe la respuesta de poozolax. ¡Es mucho mejor y 100% correcto! – iWheelBuy

Respuesta

9

Lo que hace es correcto, pero cuando NSLog morningStart la fecha se mostrará en la zona horaria GMT

Si usted quiere asegurarse de que la fecha es correcta, convertirlo a 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

Gracias por su respuesta, pero ¿cuál es la diferencia? Solo necesito el NSDate, no una cadena de NSDate. – hzxu

+0

la diferencia no afecta su aplicación, NSDate siempre que se registre lo registrará en el huso horario GMT, agregué el NSString solo para mostrarle que su fecha es correcta, sin embargo, su fecha de inicio mañana es 100% correcta y contiene la fecha en que realmente quiero :) –

+0

OK, muchas gracias! – hzxu

5

La conversión de NSDate a NSString puede ser útil, pero si necesita conservar un objeto NSDate para su posterior procesamiento, esta es su solución para tener su objeto real morningStart NSDate configurado a las 00:00:00 hora, con cuidado de la zona horaria también ... Como verá, no estuvo tan lejos de la solución:

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

genial! ¡muchas gracias! – iWheelBuy

2

Es muy fácil de hacer esto en iOS8 usando startOfDayForDate:

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

O usted puede hacerlo de la manera tradicional en Swift de la siguiente manera:

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 se almacenan en relación con GMT. Entonces, print mostrará la hora local relativa. Una comprensión clara de TimeZone es esencial para usar NSDates correctamente.)