我是这一切的新手,但我想知道我是否能得到一些帮助。 我试图从startDate和endDate中获取剩余的时间。我以为我在Apple文档中的#12列表中找到了答案---> link
在搜索stackoverflow之后,这就是我想出来的。
//My Code (This is code I found on stack overflow and modified
//Start Date
//Creating a date from a string then converting it into an NSDate Object
NSString *startDateString = @"2016-01-01 00:00:00";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"YYYY-MM-dd HH:mm:ss";
NSDate *startDate = [dateFormatter dateFromString:startDateString];
//End Date
NSString *endDateString = @"2016-12-25 00:00:00";
NSDateFormatter *endDateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"YYYY-MM-dd HH:mm:ss";
NSDate *endDate = [endDateFormatter dateFromString:endDateString];
//This is Apple's code.
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents *components = [gregorian components:unitFlags
fromDate:startDate
toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];
NSLog(@"there are %ld months and %ld days left till Christmas", months, days);
程序一直在崩溃,
NSDateComponents *components = [gregorian components:unitFlags
fromDate:startDate
toDate:endDate options:0];
问题,
有人可以指导我如何解决此问题吗?
答案 0 :(得分:4)
Simples。你为endDateFormatter发送了什么dateFormat?
我不是在问你设置的想法的dateFormat,而是做了设置的格式。两个不同的问题,答案完全不同。
现在您问我们是否可以指导您如何解决此问题:
学习使用调试器。显而易见的事情是逐行逐步执行代码,并检查生成的每个值。然后你会在组件之前注意到:fromDate:toDate:崩溃,你的endDate是零。
最重要的是:了解调试的第一条规则:你做错了什么,你需要找出它是什么。这大大减少了可能性。崩溃前只有11行代码。其中一个是错的。其中一个你写错了。只是逐个浏览它们,在你的脑海中坚定地认为其中一条线是错误的,这很明显。
(那就是我如何找到这个错误。我看着代码时坚信有错误,并搜索错误,并以这种态度对其进行了搜索。很容易找到。初学者确信他们的代码是正确的,因此他们无法看到最明显的错误)。
或者按变量检查你的代码变量。检查如何创建和更改dateFormatter。检查endDateFormatter的创建和更改方式。你能看到什么不寻常的东西?
顺便说一句。 YYYY vs yyyy bug在经验丰富的开发人员中产生了很多笑声,并在每年年初经验不足的人中产生了巨大的挫败感。每年新年前后最多三天,该错误导致许多应用程序显示错误。
顺便说一句。一个更好的问题而不是"如何找到这个问题"将是"如何避免问题"。 Maddy评论说(并且我说99%的可能性是正确的)这是一个复制/粘贴错误。
忽略不需要两个日期格式化程序的事实:在复制/粘贴之后,我使用编辑器的功能。显然你需要改变startDateString,dateFormatter和startDate的用法。编译器甚至会告诉你,因为在粘贴操作之后,你有三个重新声明的变量。
我的所作所为:双击startDateString,发出第一个错误。 Command-Shift-E(使其成为搜索字符串)。键入新名称endDateString,双击它和Command-C(复制)。 Command-G找到startDateString的下一个出现,Command-V(粘贴)再次用新名称Command-G替换它,直到更改了所有名称的使用。然后与第二个错误相同。练习使用你的编辑器。