【问题标题】:NSTimeIntervalSinceDate gives 86,399 seconds between consecutive days, why?NSTimeIntervalSinceDate 在连续几天之间给出 86,399 秒,为什么?
【发布时间】:2018-01-28 12:37:09
【问题描述】:

在 iOS、Xcode9 和 Obj-C 中,我试图找出两个日期之间的天数。我知道 NSTimeIntervalSince 方法会在几秒钟内产生结果。但似乎当我计算连续天之间的秒数(如 11-2-2016 和 11-3-2016)时,我短了 1 秒,得出 86,399。如果我计算较大间隔之间的秒数,我总是短一秒。

2016 年 11 月 2 日至 2016 年 11 月 4 日:172,799(两天 24 小时,但缺少一秒)

2016 年 11 月 2 日至 2016 年 11 月 5 日:259,199(三个 24 小时天,但缺少一秒)

这是我的代码:

@property (strong, nonatomic) NSDate *firstDate; 
@property (strong, nonatomic) NSDate *secondDate;

@synthesize firstDate, secondDate;

int secondsIntervalFirstDatetoSecondDate = (fabs([firstDate timeIntervalSinceDate:secondDate]));
NSLog(@"seconds between firstDate and secondDate %i", secondsIntervalFirstDatetoSecondDate);

firstDate 和 secodDate 是 NSDate 它们由用户使用 datePicker 输入,日期格式设置为

[formatter setDateFormat:@"MM-dd-yyyy"];

我已经搜索了答案,但没有找到。
新手第一次发帖,礼仪错误见谅,我会努力改进的。

【问题讨论】:

  • 很难说。发布创建日期对象的代码。
  • (顺便说一句,如果你是新手,为什么要用 Objective-C 编程?几乎所有新的开发都是在 Swift 中完成的。)
  • ^可能是 StackOverflow 的新手,但正在处理一个旧项目.. @OP: pastebin.com/UiC6Zp3b 这将打印 259200.0.. 您可能在某处遇到格式问题或舍入问题.. 不知何故..
  • @DuncanC 和其他人:我刚刚编辑了帖子以展示我创建的对象。我怀疑我需要向您展示更多的代码,但不确定。你们可以告诉我...
  • @DuncanC 和其他人:StackOverflow 的新手,软件开发的新手,自 2010 年以来我一直在涉足 iOS 应用程序。在 Obj-C 中工作已经够难了,所以迁移到 Swift 会翻倍我的无能!我在 1980 年代学习编码。我是一名全职医生。医生和实习生的应用程序是我的爱好,也是我对我的领域的贡献。我很想辞掉我的日常工作并深入学习编程。但我可能不太擅长,我有点喜欢并需要我的日常工作。

标签: ios nstimeinterval


【解决方案1】:

当您创建UIDatePicker 并将其置于“日期”模式时,时间就是创建日期选择器的时间。如果您要创建两个选择器,它们的创建时间会略有不同。即使在这些时间中的微小差异也可能导致 1 秒的差异。

您永远不应该以这种方式计算时差。 There are not 86,400 seconds in a day.“两个时间点之间有多少天”很复杂,你应该使用为它设计的工具:NSDateComponentsNSCalendar

NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSInteger diffInDays = [[calendar components:NSCalendarUnitDay 
                                    fromDate:[calendar startOfDayForDate:date1]
                                      toDate:[calendar startOfDayForDate:date2] 
                                     options:0] day];

【讨论】:

  • 有趣的是,日期模式下的日期选择器会及时记录它们的创建时间。我不知道。另一条评论:OP 提到了日期字符串和日期格式化程序。目前尚不清楚日期格式化程序在哪里适合这个问题(除了显示结果日期值)。您也应该使用日期组件在日期和月/日/年值之间进行转换。
  • 是的,我也不清楚日期格式化程序的参与。是的,如果您要进行任何涉及“日”、“月”或“年”的计算,则必须使用日期组件。
  • 我刚刚做了一点研究,发现UIDatePicker 设置为日期模式默认返回日期,其时间值是选择器创建的时刻,但是你可以覆盖该行为。您可以将日期选择器设置为任意日期(使用其日期属性),然后使用该日期的时间作为它返回的时间值。
  • 我在我的视图控制器的 viewDidLoad() 方法中编写了代码,该方法从当前日期获取月/日/年日期组件,然后将这些 DateComponents 转换回日期(实际上给你一个正好是午夜的日期今天。)然后,无论用户选择的日期如何,日期选择器都将始终返回时间值为午夜的 Date。
  • @RobNapier 这种技术看起来很有前途。我在我的应用程序中做的唯一其他事情是从一个日期到另一个日期的时间向前或向后移动整数天。从上面带有 'NSInteger diffInDays' 的示例中,我如何从 NSDate 'startingDate' 开始并添加或减去 'diffInDays' 以及时向前或向后移动以到达 'endingDate'?
猜你喜欢
  • 2020-02-01
  • 2022-11-25
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多