如何从 NSDate 获得 1 小时的未来时差 [重复]

Posted

技术标签:

【中文标题】如何从 NSDate 获得 1 小时的未来时差 [重复]【英文标题】:How to get future time difference of 1 hour from NSDate [duplicate] 【发布时间】:2015-04-05 14:58:36 【问题描述】:

我想为用户启用一项功能,使其仅在当前时间 1 小时后执行一项功能。我究竟应该在下面的代码中传递toDate 参数以获取与当前时间的 1 小时未来时差?我不知道如何在NSDateFormatterNSDateComponents 中设置未来时间。所以无法写出我尝试过的内容。

- (NSInteger)timeDifference:(NSDate *)fromDate ToDate:(NSDate *)toDate


    NSLog(@" FromDate: %@, ToDate: %@",fromDate,toDate);

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *differenceValue = [calendar components:NSHourCalendarUnit
                                                    fromDate:fromDate toDate:toDate options:0];
    NSLog(@"Calculated hour difference : %d",[differenceValue hour]);
    NSInteger hourDifference = [differenceValue hour];

    NSLog(@" HourDifference: %d",hourDifference);
    return hourDifference;

【问题讨论】:

【参考方案1】:

如果要创建比特定日期晚一小时的日期,可以使用dateByAddingTimeInterval 方法,例如:

NSDate *date = [NSDate date];
NSDate *plusOneHour = [date dateByAddingTimeInterval:60.0f * 60.0f];

NSLog(@"%@, %@", date, plusOneHour);

更新

正如@uchuugaka 所说,您可以使用日历方法here 找到版本。

【讨论】:

这是一种幼稚且不正确的做法,会导致错误。 @uchuugaka 我从来没有听说过这种方法不能正常工作,但你可能是对的。 它会在很长一段时间内工作,但 NSDate 是时间间隔的薄包装,不知道日历和时区的人为部分。从某种意义上说是正确的。但实际上,它忽略了所有与此相关的疯狂事情,即立法任意的极端案例。 @uchuugaka 你是对的,我找到了一个较旧的答案,它有正确的日历方法来解决这个问题,我用一个链接更新了我的答案。【参考方案2】:

查看 NSCalendar 标头以获取方便的方法。另请观看 2013 年关于日历计算主题的 WWDC 视频。 这些东西进入文档的速度真的很慢,简单地添加时间间隔是很多次错误。所有组件对于做到这一点都很重要。您需要有一个日历和一个时区才能增加具有语义意义的小时数。

在处理各地不同的午夜、闰年和夏令时时,这是一个陷阱。

特别是在这种情况下,我会从 NSCalendar.h 推荐这个

/*
    This API returns a new NSDate object representing the date calculated by adding an amount of a specific component to a given date.
    The NSCalendarWrapComponents option specifies if the component should be incremented and wrap around to zero/one on overflow, and should not cause higher units to be incremented.
*/
- (NSDate *)dateByAddingUnit:(NSCalendarUnit)unit value:(NSInteger)value toDate:(NSDate *)date options:(NSCalendarOptions)options NS_AVAILABLE(10_9, 8_0);

但该标头中有几种方法就足够了。请仔细观看 WWDC 视频几次。非常值得您花时间,您的用户体验会更好。

【讨论】:

以上是关于如何从 NSDate 获得 1 小时的未来时差 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何获得两个日期的时差,例如 x 天 y 小时 z 秒 t 分钟 [重复]

将(日期+时间)从 NSString 转换为 NSDate 并添加一些小时

如何获得两个日期对象之间的小时差? [复制]

如何获得两个日期之间的小时差?

如何从 NSDate 获取小时和分钟?

iOS:从 NSDate 获取本地化小时