如何在 [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?的主要内容,如果未能解决你的问题,请参考以下文章