【问题标题】:Strange NSDate after changing hour更改时间后奇怪的NSDate
【发布时间】:2018-12-16 20:11:10
【问题描述】:
我想更改 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:00:00 + 0000 但我得到了 2018-07-10 03:00:00 UTC。我应该怎么做才能得到预期的日期?
【问题讨论】:
标签:
ios
objective-c
timezone
nsdate
【解决方案1】:
我认为您将NSDate 与NSCalendar 混合在一起:NSDate 是一个时间点,在内部以UTC 表示。要获取日历或手表上显示的本地日期/时间,请使用NSCalendar。
因此,如果您在 MEST (UTC+2) 并且在日历上将时间设置为“5”小时,那么这将是 UTC“3”小时。
要取回日历日期/时间,您可以使用来自NSCalendar 的components(_:from:)。
只需检查此代码:
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] dateForNewEvent: 2018-07-09 07:24:13 +0000
2018-07-09 11:11:43.542 jdoodle[22:22] 决赛:2018-07-09 05:24:00 +0000
【解决方案2】:
要更改特定NSDate 的营业时间,您需要通过NSDateComponents 对其进行操作。请尝试以下代码:
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]]);
希望这会有所帮助!