2012-06-21 3 views
11

Мне нужно получить объект NSDate за 00:00 (начало дня) из [NSDate date], допустим, если в настоящее время он находится 11:30 (возвращается [NSDate date]), 01/06/2012, теперь мне нужно иметь NSDate в 00:00 по 01/06/2012.Как получить NSDate за 00:00 в день [NSDate date]?

Я не пробовал это, но то, что в моей голове есть:

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

Так я первый получить текущую дату (скажем, это 01/06/2012), и построить NSDateComponent на дату , то я устанавливаю час/минуту/секунду в 0, а год/месяц/день не должен меняться (например, 01/06/2012), тогда я создаю NSDate для этого компонента, и могу ли я получить дату 00:00 : 00 01/06/2012?

+0

Проверьте ответ от poozolax. Это намного лучше и на 100% правильно! – iWheelBuy

ответ

9

Что вы делаете правильно, но когда вы NSLog morningStart дата будет отображаться в часовом поясе GMT ​​

Если вы хотите убедиться, что дата верна, преобразовать его в 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

Спасибо за ваш ответ, но в чем разница? Мне нужен только NSDate, а не строка NSDate. – hzxu

+0

Разница не влияет на ваше приложение, NSDate всякий раз, когда он регистрируется, он будет регистрировать его в часовом поясе GMT, я добавил NSString только для того, чтобы показать вам, что ваша дата правильная, однако ваша дата на день начала 100% правильная, и она содержит дату, которую вы фактически хочу :) –

+0

ОК, большое спасибо! – hzxu

5

Преобразование NSDate в NSString может быть полезным, но если вам нужно сохранить объект NSDate для дальнейшей обработки, вот ваше решение, чтобы ваш реальный объект morningStart NSDate был установлен в 00:00:00, также заботясь о часовом поясе ... Как вы увидите, вы не так далеко от решения:

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

отлично! большое спасибо! – iWheelBuy

2

Это очень легко сделать это в iOS8 с помощью startOfDayForDate:

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

ИЛИ вы можете сделать это традиционным способом в Swift следующим образом:

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) 

(Примечание: NSDates сохраняются относительно GMT. Таким образом, print отобразит относительное местное время. Четкое понимание TimeZone важно для правильного использования NSDates.)

Смежные вопросы