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

Posted

技术标签:

【中文标题】如何在 [NSDate 日期] 当天 00:00 获取 NSDate?【英文标题】:How to get NSDate for 00:00 on the day of [NSDate date]? 【发布时间】:2012-06-21 07:40:21 【问题描述】:

我需要从 [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,并且不应更改年/月/日(即 2012 年 1 月 6 日)然后我为此组件设置创建一个 NSDate,我可以获得 00:00:00 01/06/2012 的日期吗?

【问题讨论】:

检查 poozolax 的答案。它要好得多,而且 100% 正确! 【参考方案1】:

你的做法是正确的,但是当你 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

【讨论】:

感谢您的回答,但有什么区别?我只需要 NSDate,而不是 NSDate 的字符串。 差异不会影响您的应用程序,无论何时记录 NSDate,它都会在 GMT 时区记录它,我添加 NSString 只是为了向您显示您的日期是正确的,但是您的 morningStart 日期是 100% 正确的它包含你真正想要的日期:)【参考方案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's date
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: date)
let dateAtStartOfDay = calendar.dateFromComponents(components)!
print(dateAtStartOfDay) 

注意: NSDates 是相对于 GMT 存储的。所以print 将显示相对本地时间。清楚地了解 TimeZone 对正确使用 NSDates 至关重要。)

【讨论】:

以上是关于如何在 [NSDate 日期] 当天 00:00 获取 NSDate?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从 NSDate 获取日、月和小时

js如何返回当天零点的时间戳?

js如何返回当天零点的时间戳?

iOS将NSDate的UTC日期转换为本地时间以获取本地通知

如何创建代表下一个指定日期时间的完整 NSDate 对象?

谓词因从 Core Data 获取属性类型为“NSDate”对象的对象而失败