3月份日期之间的错误日
我有一个非常有趣的问题:当计算两个日期之间的天数时,我的计算器在3月份给出了错误的结果只有。我有两个文本字段,每个日期一个。如果我在date1中输入3/7/12,在date2中输入3/13/12,结果是7,这是正确的(我也计算第一天)。但是当我输入date1 = 3/7/12和date2 = 3/14/12时,结果仍然是7,但它应该是8.同样,如果我输入date1 = 3/7/12和date2 = 3/23/12,结果应该是17,但是它是16.如果我将月份更改为4月,那么date1 = 4/7/12和date2 = 4/23/12,结果是17.每月按照预期工作,只有三月份给我错误的结果。有没有人有任何想法我失踪?这是一个时区问题吗?我如何解决它?这里是我的代码:3月份日期之间的错误日
NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
[dateFormatter1 setDateFormat:@"MM/dd/yyyy"];
NSDate *startdate1 = [dateFormatter1 dateFromString: date1.text];
NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init];
[dateFormatter2 setDateFormat:@"MM/dd/yyyy"];
NSDate *enddate2 = [dateFormatter2 dateFromString: date2.text];
int start1 = [startdate1 timeIntervalSince1970];
int end2 = [enddate2 timeIntervalSince1970];
double difference12 = end2-start1;
int days12;
days12 =(int)((double)difference12/(3600.0*24.00)+1);
result12.text = [[NSString alloc] initWithFormat:@"%i", days12]
大多数像这样的是夏令时问题(2012年3月11日)。将日期格式化程序的时区设置为:
[NSTimeZone timeZoneForSecondsFromGMT:0];
这应该解决该问题。
如果您使用NSCalendar,则不需要处理夏令时计算。
int days = [[[NSCalendar currentCalendar] components:NSDayCalendarUnit
fromDate:startDate1
toDate:endDate2
options:0] day] + 1;
谢谢,修好了! – 2013-02-11 06:01:24
@GeorgeFriday:不要接受帮助的答案,请参阅http://meta.stackexchange.com/a/5235/196432。 – 2013-02-11 06:06:45
您可以将NSDate视为时间点。如果你想计算两个日期之间的天数,这是一个日历问题,并有多个日历(如玛雅日历)。
你需要的是NSDateComponents:
NSDate *dateToday = [NSDate date];
NSDateComponents *dateBComponent = [[NSDateComponents alloc] init];
[dateBComponent setDay:-10];
NSDate *date10DaysAgo = [[NSCalendar currentCalendar] dateByAddingComponents:dateBComponent
toDate:dateToday
options:0];
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *components = [calendar components:NSDayCalendarUnit
fromDate:date10DaysAgo
toDate:dateToday
options:0];
NSLog(@"Difference: %d", components.day);
在美国,夏令时间为3月11日,2012年(这是3月10日,2013年)。假设你在美国,当两个日期跨越3月11日(或10日)时,这可能会推迟计算。 – rmaddy 2013-02-11 05:22:30