我正在尝试生成一个固定小时和分钟的NSDate。我需要这个与CoreData中存储的其他日期进行相同的比较。
到目前为止,我写了这段代码:
NSDate date = [NSDate date];
unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:flags fromDate:date];
NSDate* newDate = [calendar dateFromComponents:components];
但是在xcode4中有一个断点我可以看到值:
Printing description of date:
2012-01-10 11:20:47 +0000
Printing description of newDate:
2012-01-09 23:00:00 +0000
为什么newDate是关于约会的一天?
/ *编辑* /
我也尝试手动设置所有组件,但是日历dateFromComponents总是返回相同的一个小时的返回日期,似乎忽略了组件。
components.hour=0;
components.minute=0;
components.second=0;
components.timeZone=[NSTimeZone localTimeZone];
这是设置后组件的描述:
<NSDateComponents: 0x7464de0>
TimeZone: Europe/Rome (CET) offset 3600
Calendar Year: 2012
Month: 1
Day: 10
Hour: 0
Minute: 0
Second: 0
这正是我想要的,但是这个组件的计算日期仍然是
Printing description of newDate:
2012-01-09 23:00:00 +0000
我想知道为什么即使指定NSDateComponents中的所有组件也无法获得精确的NSDate。仅仅因为NSCalendar忽略了我的要求,组件的含义是什么?
我做错了什么?
答案 0 :(得分:3)
我猜你是+01:00时区。实际上,NSDate总是给出GMT中的值。因此,如果是1月10日00:00,那么GMT时间是1月9日23:00。
甚至,在打印以下行时
2012-01-10 11:20:47 +0000,
它应该打印比当前时间少1小时。请检查。
答案 1 :(得分:1)
使用此....
NSDate *date = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setLocale:[NSLocale currentLocale]];
NSDateComponents *nowComponents = [gregorian components:NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:date];
NSDate* newDate = [gregorian dateFromComponents:nowComponents];
NSLog(@"%@\n%@",date,newDate);
答案 2 :(得分:0)
您可能遇到时区问题,请尝试为日历设置时区。