12

我需要从 [NSDate 日期] 获取 00:00(一天的开始)的 NSDate 对象,假设当前是 11:30(由 [NSDate 日期] 返回),在 2012 年 1 月 6 日,现在我需要在 2012 年 1 月 6 日上午 00:00 进行 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 的日期吗?

4

3 回答 3

10

您所做的是正确的,但是当您 NSLog 早上开始时,日期将显示在 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
于 2012-06-21T07:48:28.740 回答
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];
于 2013-10-15T08:31:35.693 回答
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 至关重要。)

于 2015-06-22T19:02:16.790 回答