如何在[NSDate日期]当天00:00获得NSDate?

时间:2012-06-21 07:40:22

标签: iphone nsdate nscalendar nsdatecomponents

我需要从[NSDate日期] 00:00(当天开始)获取NSDate对象,假设当前是上午11:30(由[NSDate日期]返回),在01/06/2012 ,现在我需要在01/06/2012 00:00 am获得NSDate。

我没试过,但我的想法是:

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的日期吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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];

答案 2 :(得分:2)

使用startOfDayForDate

在iOS8中轻松完成此操作
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至关重要。)