我对这一切都是陌生的,但我想知道我是否能得到一点帮助。 我正在尝试从 startDate 和 endDate 中获取剩余的天数。我想我在 Apple 文档中的 list #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];
问题,
谁能指导我如何解决这个问题?
最佳答案
简单。您为 endDateFormatter 发送了什么日期格式?
我不是在问你认为你设置了什么日期格式,而是你确实设置了哪种格式。两个不同的问题,完全不同的答案。
现在你问我们是否可以指导你如何解决这个问题:
学习使用调试器。显而易见的事情是逐行执行代码,并检查产生的每个值。然后,您会在 components:fromDate:toDate: 崩溃之前注意到您的 endDate 为零。
最重要的是:学习调试的第一条规则:你做错了什么,你需要找出问题所在。这大大减少了可能性。崩溃前只有 11 行代码。其中一个是错误的。其中一个你写错了。只需一条一条地检查它们,在您的脑海中坚信其中一行是错误的,这将是显而易见的。
(我就是这样找到bug的。我抱着有错的信念看了代码,然后去搜索错误,抱着这种态度很容易找到。初学者深信不疑他们的代码是正确的,因此他们看不到最明显的错误)。
或者逐个变量地检查您的代码。检查 dateFormatter 是如何创建和更改的。检查如何创建和更改 endDateFormatter。你能看到什么不寻常的东西吗?
顺便说一句。 YYYY 与 yyyy 错误在每年年初在经验丰富的开发人员中引起大量笑声,并在经验不足的开发人员中造成巨大的挫败感。每年元旦前后最多三天,该错误会导致许多应用程序显示错误的年份。
顺便说一句。比“如何找到这个问题”更好的问题是“如何避免这个问题”。 Maddy 指出(我认为它有 99% 的可能性是正确的)这是一个复制/粘贴错误。
忽略不需要两个日期格式化程序的事实:在这样的复制/粘贴之后,我使用了编辑器的功能。显然,您需要更改 startDateString、dateFormatter 和 startDate 的使用。编译器甚至会告诉您,因为在粘贴操作之后您立即拥有三个重新声明的变量。
我做什么:双击 startDateString 给出第一个错误。 Command-Shift-E(使其成为搜索字符串)。输入新名称 endDateString,双击它和 Command-C(复制)。 Command-G 查找下一次出现的 startDateString,Command-V(粘贴)用新名称替换它,Command-G 再次出现,直到所有名称的使用都被更改。然后与第二个错误相同。练习使用你的编辑器。
关于ios - 我的程序不断崩溃,我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687643/