NSDate零小时分钟和秒

时间:2014-02-20 08:58:59

标签: ios objective-c cocoa-touch nsdate

我有一个NSDate,我希望零小时,分钟和秒。我想要的结果是:2014-02-19 00:00:00 +0000。我尝试过以下方法:

NSUInteger flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* components = [[NSCalendar currentCalendar] components:flags fromDate:self.birthDatePicker.date];
NSDate* birthDate = [[NSCalendar currentCalendar] dateFromComponents:components];

出于某种原因,我得到了这个:2014-02-19 23:00:00 +0000。小时不归零。我还尝试设置[components setHour:0]。但是我得到了相同的结果23几个小时。关于我做错了什么的任何想法?

3 个答案:

答案 0 :(得分:3)

看看这个图书馆:https://github.com/mysterioustrousers/MTDates

我遇到了类似的问题,我决定使用它。它有很多与日期相关的功能。你需要的是:

- (NSDate *)mt_startOfCurrentDay;

关于时区。 NSDate独立于时区格式。您需要的时区可以在NSDateFormatter实例中指定。

更新完整代码示例

NSDate *date = [NSDate date];
NSLog(@"%@", date); // 2014-02-20 11:11:40 +0000
[NSDate mt_setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSLog(@"%@", [[date mt_startOfCurrentDay] mt_stringFromDateWithISODateTime]); // 2014-02-20 00:00:00 +0000

对于其他日期格式,请使用时区和自定义日期格式设置NSDateFormatter

另一个解决方案这个没有库:

NSDate *date = [NSDate date];
NSLog(@"%@", date); // 2014-02-20 11:36:20 +0000
NSUInteger flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:currentCalendar.calendarIdentifier];
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDateComponents* components = [calendar components:flags fromDate:date];
date = [calendar dateFromComponents:components];
NSLog(@"%@", date); // 2014-02-20 00:00:00 +0000

P.S。顺便说一下,我有GMT + 3时区

答案 1 :(得分:2)

在NSDate上考虑此类别:

@interface NSDate (Utilities)
- (NSDate *) dateAtStartOfDay;
@end

@implementation
- (NSDate *) dateAtStartOfDay
{

   NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:self];
   [components setHour:0];
   [components setMinute:0];
   [components setSecond:0];
   return [[NSCalendar currentCalendar] dateFromComponents:components];
}
@end

代码取自Erika Sadun NSDate Extension

答案 2 :(得分:0)

始终乐于助人:

WWDC视频

2011 Session 117 - Performing Calendar Calculations

2013 Session 227 - Solutions to Common Date and Time Challenges


这包含您可能需要的信息:

会话 227 @ 13m25s ,“常用操作”/“计算午夜”。