【发布时间】:2015-02-02 08:51:49
【问题描述】:
当尝试在我能找到的所有 stackoverflow 问题上使用建议的“正确”方法添加一个月时,由于 DST,我返回的日期总是会损失一个小时。
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *component = [[NSDateComponents alloc] init];
[component setDay:29];
[component setMonth:3];
[component setYear:2015];
NSDate *date = [gregorian dateFromComponents:component];
NSLog(@"Date: %@", date);
NSDateComponents *monthComponent = [[NSDateComponents alloc] init];
monthComponent.month = 1;
NSDate *newDate = [gregorian dateByAddingComponents:monthComponent toDate:date options:0];
NSLog(@"newDate: %@", newDate);
这段代码的输出是:
日期:2015-03-29 00:00:00 +0000
新日期:2015-04-28 23:00:00 +0000
如何在 DST 更改中添加一个月并将时间保持在午夜?
感谢您的帮助。
响应 gnasher729 的示例如下:
在示例中,前两个日期设置为午夜,后两个日期设置为 23:00。在将所有输出日期保持在所需的午夜时间的同时实现类似这样的最佳实践是什么?
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *initialDateComponent = [[NSDateComponents alloc] init];
[initialDateComponent setDay:29];
[initialDateComponent setMonth:1];
[initialDateComponent setYear:2015];
NSDate *date = [gregorian initialDateComponent];
NSLog(@"Date: %@", date);
NSDateComponents *monthComponent = [[NSDateComponents alloc] init];
monthComponent.month = 1;
monthComponent.hour = 0;
NSMutableArray *eventAlarmDate = [[NSMutableArray alloc] init];
int numberOfRepeatingMonths = 4;
for(int x = 0; 0 < numberOfRepeatingMonths; x++) {
date = [gregorian dateByAddingComponents:monthComponent toDate:date options:0];
[eventAlarmDate addObject:date];
}
【问题讨论】:
标签: ios objective-c iphone nsdate