2012-06-21 4 views
11

Ich muss ein NSDate-Objekt für 00:00 (Beginn des Tages) von [NSDate Datum], sagen wir, wenn es derzeit 11:30 Uhr ist (zurückgegeben von [NSDate Datum]), am 01/06/2012, Jetzt muss ich am 01.06.2012 um 00:00 Uhr ein NSDate haben.Wie bekomme ich NSDate für 00:00 am Tag [NSDate Datum]?

ich nicht versucht haben, aber was in meinem Kopf ist:

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

Also zuerst ich aktuelles Datum erhalten (sagen, es ist 01.06.2012) und ein NSDateComponent für das Datum konstruieren , dann setze ich Stunde/Minute/Sekunde auf 0 und das Jahr/Monat/Tag sollte nicht geändert werden (zB 01.06.2012), dann erstelle ich ein NSDate für diese Komponenteneinstellung und bekomme ein Datum von 00:00 : 00 01/06/2012?

+0

Überprüfen Sie die Antwort von poozolax. Es ist viel besser und 100% korrekt! – iWheelBuy

Antwort

9

Was Sie ist zu tun richtig, aber wenn Sie NSLog morningStart das Datum in GMT Zeitzone angezeigt werden

Wenn Sie sicher wollen, dass das Datum korrekt ist, wandelt es 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

Danke für Ihre Antwort, aber was ist der Unterschied? Ich brauche nur das NSDate, keine Zeichenfolge des NSDate. – hzxu

+0

Unterschied betrifft nicht Ihre Anwendung, NSDate wann immer protokolliert wird es in GMT Zeitzone protokolliert, ich fügte den NSString nur um Ihnen zu zeigen, dass Ihr Datum korrekt ist, aber Ihr morningStart Datum ist 100% korrekt und es hält das Datum Sie tatsächlich wollen :) –

+0

OK, vielen Dank! – hzxu

5

Das Konvertieren von NSDate in NSString kann hilfreich sein, aber wenn Sie ein NSDate-Objekt für die weitere Verarbeitung behalten möchten, haben Sie hier die Lösung, Ihr echtes morningStart NSDate-Objekt auf 00:00:00 einzustellen, auch mit der Zeitzone ... Wie Sie sehen werden, waren Sie nicht so weit von der Lösung entfernt:

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

großartig! Danke vielmals! – iWheelBuy

2

Es ist sehr einfach, dies in iOS8 zu tun startOfDayForDate mit:

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

ODER Sie können es auf traditionelle Weise in Swift wie folgt vorgehen:

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) 

(Hinweis: NSDates sind relativ zu GMT gespeichert. So zeigt print die relative Ortszeit an. Ein klares Verständnis von TimeZone ist wesentlich für die ordnungsgemäße Verwendung von NSDates.)