2

这是我可以将今天的日期作为字符串获取的代码:

 NSString *string;
    NSDateFormatter *formatter;
    string = [formatter stringFromDate: [NSDate date]];
    formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat: @"yyyy-MM-dd "];
    string = [formatter stringFromDate: [NSDate date]];

但是现在我希望我将此字符串作为参数,并且一个方法将在此日期的 10 天之后的日期作为字符串返回。但我找不到任何解决方案。有谁能够帮助我?

4

4 回答 4

7

我的答案会更长一些,可能会有点过时,但我认为最好让您了解日期管理中的概念,而不是“复制和粘贴”答案。事实上,即使直观,日期管理也是一项相当复杂的任务。为了正确使用 Cocoa,您必须了解一些基本概念。

“日期”概念本身只是从参考日期经过多少秒的数字表示。这是一个绝对的衡量标准,没有什么可以改变它:如果你说现在是时间 0,那么 10 秒后就是时间 10,以此类推。它由带有“NSDate”的 Cocoa 表示。

现在要将“数字日期”转换为“日历日期”,您需要将此数字日期应用于“日历”(“NSCalendar”Cocoa 类)。显然,周围有许多类型的日历,所以您必须选择要使用的正确日历,然后将数字日期应用到它:有效的结果将是“日历化日期”。请注意,所有日历共有的相同“数字日期”是一个绝对度量,在不同的日历上会提供不同的结果。日历是一个复杂的算法或表格,将每个数字日期映射到特定的“日历日期”。

制作日历日期的组件称为“日期组件”,由 Cocoa 类“NSDateComponents”表示。正如您可能已经理解的那样,您不能直接将“日期组件”与“日期”联系起来,但您需要通过“日历”来协调它们。这就是为什么与“Date”和“NSDateComponents”类相关的所有方法都在“NSCalendar”类中定义,这解释了为什么特定的“NSDateComponents”实例与特定的“NSCalendar”实例相关联。

最后,您的最后一步是将“日期组件”转换为“人类可读格式”。为此,您使用“NSDateFormatter”对象。虽然将日期格式化程序链接到日期组件会更合适,但为了方便从日期到字符串的转换,反之亦然,NSDateFormatter 方法直接使用 NSDate 对象而不是 NSDateComponents。显然 NSDateFormatter 类必须与特定的日历相关联(并且要小心:它是使用默认日历初始化的)。

现在您已经掌握了这些信息包,您可以轻松了解如何进行操作。您的任务是在 10 天后将“字符串格式”的日期转换为相同格式的日期。所以要完成的任务是(代码如下):

1. identify the Calendar you want to use
2. create a NSDateFormatter that accepts your input string and link the Calendar to it
3. use NSDateFormatter to import the string to a "NSDate"
4. use the NSCalendar to convert the date to a NSDateComponents object
5. add 10 days to the "day" component of NSDateComponents; don't take care of "end of month" or "end of year", because NSDateComponents + NSCalendar know how to do it!
6. use NSCalendar again to convert the new recalculated NSDateComponents instance to NSDate
7. use the NSDateFormatter you defined before to convert the new NSDate to a NSString.

你可能会问:为什么我不能只总结我导入的 NSDate 10*24*60*60 秒?虽然在大多数情况下,此解决方案会起作用,但在某些情况下,此操作会提供不正确的结果。例如,在夏令时开关中,您将时钟调回 1 小时,即 60*60 = 3600 秒。这意味着在您的日历中,1 小时的秒数范围将映射到两个不同的日期/时间(切换前 1 小时和切换后 1 小时)。此信息不为 NSDate 所知,但为 NSCalendar 所知。您可以通过这种方式直观地看到正在发生的事情:想象一条无限长的线(时间线),其中每一个“滴答”都是 1 秒。如果您保留您现在所在的“时间点”,则此标记将与您日历和时钟中的特定日期和时间相关联。现在想象一下,在这个时间线上确定您进行夏令时切换的点,并假设您当时需要将时钟恢复到 1 小时前。你所做的是将时间线分成两部分,然后取下半部分并将其第一个小时与上半场的最后一个小时重叠。然后您会看到时间仍在继续,但是您在这 1 小时重叠中的日历将与两个给定的时间范围相关联!这是您的日历 + 区域设置 + 时区仅知道的信息,而不是 NSDate 单独知道的信息(顺便说一下,我故意跳过这里关于“时区”和“区域设置”的任何讨论:它们是相关的,因为时区负责将绝对时间与一天中的有效时间相关联,而区域设置可以更改某些日历规则,例如夏令时开关)。

NSString *startDateStr = @"2013-02-25";
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.calendar=calendar;
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *startDate = [dateFormatter dateFromString:startDateStr];
NSDateComponents *startComponents = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:startDate];
startComponents.day+=10;
NSDate *endDate = [calendar dateFromComponents:startComponents];
NSString *endDateStr = [dateFormatter stringFromDate:endDate];
NSLog(@"Date %@ + 10 days gives %@",startDateStr,endDateStr);

请注意,使用 NSCalendar 可以简化上述计算,dateByAddingComponents:toDate:options:但我更喜欢第一种方法,以便更好地了解类之间的交互。

于 2013-02-12T10:01:12.013 回答
3
NSDate *now = [NSDate date];
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*10];

这将在 10 天后返回日期。

于 2013-02-12T08:35:54.833 回答
1

将您的 fromDate 字符串转换为 Date 类型并使用以下函数并将 days 参数作为 10 传递:

NSString *fromDateString = @"Your_date_string";

// Convert string to date object
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"YOUR_DATE_FORMAT"];
NSDate *fromDate = [dateFormat dateFromString:dateStr];  
[dateFormat release];

+ (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days
{
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    dateComponents.day = days;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *previousDate = [calendar dateByAddingComponents:dateComponents
                                                     toDate:fromDate
                                                    options:0];
    [dateComponents release];
    return previousDate;
}
于 2013-02-12T09:04:21.607 回答
-1

日期后 10 天的代码 ::

NSDateFormatter *entryDateFormat;
entryDateFormat = [[NSDateFormatter alloc]init];
[entryDateFormat setDateFormat:@"dd-MM-yyyy HH:mm:ss"];

NSString *s = [NSString stringWithFormat:@"%@", [entryDateFormat stringFromDate:[[NSDate date] dateByAddingTimeInterval:60*60*24*10]]];
NSLog(@" --> %@", s);
于 2013-02-12T08:46:53.303 回答