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

Мне нужно получить NSDate-объект за 00:00 (начало дня) с [NSDate date], пусть скажет, что в настоящее время это 11:30 утра (возвращается [NSDate date]), 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?

Ответ 1

Что вы делаете правильно, но когда вы 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

Ответ 2

Преобразование 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];

Ответ 3

Это очень легко сделать в 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 date
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: date)
let dateAtStartOfDay = calendar.dateFromComponents(components)!
print(dateAtStartOfDay) 

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