Вопрос по iphone, nsdate, nscalendar, nsdatecomponents – Как получить NSDate на 00:00 в день [NSDate date]?

12

Мне нужно получить объект 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?

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

Ваш Ответ

3   ответа
10

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

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.)

5

но если вам нужно сохранить объект 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];
отличный! большое спасибо!

Похожие вопросы