Как получить NSDate на 00:00 в день [NSDate date]?

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

Я не пробовал это, но я думаю следующее:

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?

 iWheelBuy10 авг. 2014 г., 09:01
Проверьте ответ от poozolax. Это намного лучше и на 100% правильно!

Ответы на вопрос(3)

Решение Вопроса

что вы делаете, правильно, но когда вы 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
 hzxu21 июн. 2012 г., 10:06
ОК, спасибо большое!
 21 июн. 2012 г., 10:00
разница не влияет на ваше приложение, NSDate, когда он зарегистрирован, будет регистрировать его в часовом поясе GMT, я добавил строку NSString только для того, чтобы показать вам, что ваша дата правильная, однако ваша дата morningStart на 100% правильная, и она содержит дату, которую вы на самом деле хотите :)
 hzxu21 июн. 2012 г., 09:58
Спасибо за ваш ответ, но в чем разница? Мне нужен только NSDate, а не строка NSDate.
 21 июн. 2012 г., 10:07
Добро пожаловать :)

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) 

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

но если вам нужно сохранить объект NSDate для дальнейшей обработки, вот ваше решение, чтобы ваш реальный объект NSDate morningStart был установлен в 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];
 10 авг. 2014 г., 08:57
отличный! большое спасибо!

Ваш ответ на вопрос