我需要一个NSDate对象为00:00从[NSDate的日期(一天的开始),比方说,如果当前是上午11:30(由返回[NSDate的日期]),于01/06/2012,现在我需要有一个NSDate为00:00 AM上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日期?
你在做什么是正确的,但是当你的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到的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];
这很容易使用要做到这一点在iOS8上startOfDayForDate
:
let date = NSDate()
let calendar = NSCalendar.currentCalendar(calendarIdentifier: NSGregorianCalendar)
let dateAtStartOfDay = calendar.startOfDayForDate(date)
OR如下可能做到这一点在斯威夫特的传统方式:
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
将显示相对本地时间时区的明确认识是使用NSDates正确必不可少的。)