使用2011-01-01从NSDateComponent中获取错误的NSDate

时间:2011-03-09 05:23:30

标签: iphone objective-c nsdate nsdateformatter nsdatecomponents

我正在从NSDateComponents和NSDateFormatter中得到一些奇怪的结果。

我有以下方法将小时设置为给定日期的上午10点

+ (NSDate *)getTenOClockOnDate:(NSDate*)inputDate
{

NSCalendar *cal = [NSCalendar autoupdatingCurrentCalendar];

NSDateComponents *components = [cal components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit ) fromDate:inputDate];

[components setHour:10];
[components setMinute:0];
[components setSecond:0];

// construct new date and return
NSDate *newDate = [cal dateFromComponents:components];

NSLog(@"input date: %@ -- new date: %@", inputDate, newDate);

return newDate;
}

我拨打以下电话:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];    
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2010-12-31"]];
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2011-01-01"]];
[MyUtils getTenOClockOnDate:[dateFormatter dateFromString:@"2011-01-02"]];

只有第二行,我得到意想不到的结果:

input date: 2010-12-31 05:00:00 GMT -- new date: 2010-12-31 15:00:00 GMT
input date: 2011-01-01 05:00:00 GMT -- new date: 2011-12-31 15:00:00 GMT
input date: 2011-01-02 05:00:00 GMT -- new date: 2011-01-02 15:00:00 GMT

问题出在第二条记录,2011-01-01,只需将小时设置为10即可转为2011-12-31。

3 个答案:

答案 0 :(得分:1)

Swift中的

Println(date)不正确,请nsdateformatter使用stringfromdate

我想这也适用于nslog,在Objective-C

答案 1 :(得分:0)

这确实看起来确实很奇怪...虽然你的代码看起来应该没问题,但是当你正在初始化NSDateComponents对象时你将不会启用{{1 }和NSHourCalendarUnit

虽然您认为这不是必要的,但我认为我遇到了类似的问题,并且发现这些问题需要正确修改日期时间并获得您想要的结果。

如果这不起作用,也许尝试设置日历的时区可能是必要的,因为它们是我所做的唯一差异,并且看起来确实有魅力。

答案 2 :(得分:0)

这将从NSDateComponents中提供正确的NSDate值,

NSDateFormatter* df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd"];
NSDate* date = [df dateFromString:@"2011-01-01"];
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];
[df release];

NSLog(@"Day : %d, Month : %d, Year : %d",day,month,year);

它可能对你有帮助。