Ios 更改时间后的日期

Ios 更改时间后的日期,ios,objective-c,timezone,nsdate,Ios,Objective C,Timezone,Nsdate,我想更改日期中的小时数。我是这样做的: NSDate *final = [gregorian dateBySettingUnit:NSCalendarUnitHour value:hour.intValue ofDate:self.dateForNewEvent options:NSCalendarMatchStrictly]; 其中self.dateForNewEvent=2018-07-09 07:24:13+0000 hour.intValue=5,我预计日期为2018-07-09 05

我想更改日期中的小时数。我是这样做的:

NSDate *final = [gregorian dateBySettingUnit:NSCalendarUnitHour value:hour.intValue ofDate:self.dateForNewEvent options:NSCalendarMatchStrictly];
其中self.dateForNewEvent=2018-07-09 07:24:13+0000
hour.intValue=5,我预计日期为2018-07-09 05:00:00+0000,但我得到了2018-07-10 03:00:00 UTC。我应该怎样做才能得到预期的日期

我认为您将
NSDate
NSCalendar
混合使用:
NSDate
是一个时间点,内部以UTC表示。要获取日历或手表上显示的本地日期/时间,请使用
NSCalendar

因此,如果您在MEST(UTC+2)中,并将日历上的时间设置为“5”小时,这将是UTC“3”小时

要返回日历日期/时间,可以使用
组件(:from:)
from
NSCalendar


只需检查以下代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
NSDate * dateForNewEvent = [dateFormatter dateFromString: @"2018-07-09T07:24:13+00:00"];
NSLog(@"dateForNewEvent: %@", dateForNewEvent);


NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

NSDateComponents *comps = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear|NSCalendarUnitHour|NSCalendarUnitMinute fromDate:dateForNewEvent];
[comps setHour:5];

NSDate *final = [gregorian dateFromComponents:comps];
NSLog(@"final: %@", final);
按预期产出:

2018-07-09 11:11:43.542 jdoodle[22:22]新事件日期:2018-07-09 07:24:13+0000

2018-07-09 11:11:43.542 jdoodle[22:22]最终结果:2018-07-09 05:24:00+0000


要更改特定日期的小时数,您需要通过进行操作。请尝试以下相同的代码:

NSDate *now = [NSDate date]; // YOUR DATE INSTANCE
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:now];
[components setHour:5];
NSDate *today5am = [calendar dateFromComponents:components];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
NSLog(@"Date ===>>> %@",[dateFormatter stringFromDate:[NSDate date]]);
希望这有帮助