【问题标题】:Get an Accurate Time Difference Between two NSDate?获得两个 NSDate 之间的准确时差?
【发布时间】:2012-01-13 07:32:24
【问题描述】:

有什么方法可以准确找出两个NSDate 之间的区别吗?

我找到了解决方案,但它们还不够准确。我需要考虑夏令时,不同月份有不同天数的事实等。

一个简单的计算,例如 /60/60/24 等来计算分钟、小时和天并没有考虑到它们。

假设我需要计算现在 ([NSDate date]) 和 12 月 25 日晚上 10:22(用户使用日期选择器 [datePicker date] 选择的日期)之间的时间差,我该怎么做?
知道准确的时差不是关键,只要我有准确的日月年差就行了。

【问题讨论】:

  • 历法计算很难。聪明的人经常弄错。最大的陷阱是相信它很简单。慢慢来,并期望在此过程中犯错误。需要注意的是 Cocoa 提供了很好的工具来正确地做这件事,但似乎并不容易做到我所说的工具。第一步是阅读并重新阅读文档,然后猜测您的理解。需要对它们有清晰的了解才能完全定义您的实际问题和解决方案。这可能会令人沮丧,但它们实际上提供了迫使您正确完成任务的工具(经过一番努力)

标签: ios objective-c cocoa-touch nsdate


【解决方案1】:

来自苹果的Date & Time Programming Guide

清单 12 获取两个日期之间的差异

NSDate *startDate = ...;
NSDate *endDate = ...;

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

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags
                                          fromDate:startDate
                                          toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];

【讨论】:

    【解决方案2】:

    NSDate 完全独立于时区。 NSDate 甚至没有考虑夏令时。只有当您将 NSDate 转换为人类可读的格式(MM/DD/YY、HH:MM:SS 格式等)时,时区才会出现。

    确保在创建 NSDate 时考虑正确的时区、夏令时设置。随后,[date1 timeIntervalSinceDate:date2] 方法应该始终为您提供准确的时差。

    【讨论】:

    • 这种方法的问题在于,我在两个日期之间得到了准确的秒数,但是将其细分为天、月和年是不准确的,因为它太复杂而无法考虑如何鬃毛天在那个月或那个年,改变分隔线。理解?这就是我避免这样做的原因。
    • Sanjay Chaudhry 的回答回答了您的问题。我猜你没有问一个足够精确的问题。
    【解决方案3】:

    因此,您要问的更准确的问题是:如何从两个日期之间的差异中获得格式良好的日、月、年。首先您要获取 nsTimerInterval(以秒为单位的时间差),然后对其进行格式化:

    How do I break down an NSTimeInterval into year, months, days, hours, minutes and seconds on iPhone?

    【讨论】:

      【解决方案4】:

      最新iOS代码小更新:

      NSDate *startDate = ...;
      NSDate *endDate = ...;
      
      NSCalendar *gregorian = [[NSCalendar alloc]
                                   initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
      
      NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay;
      
      NSDateComponents *components = [gregorian components:unitFlags
                                                  fromDate: startDate
                                                    toDate:endDate options:0];
      NSInteger months = [components month];
      NSInteger days = [components day];
      

      【讨论】:

        猜你喜欢
        • 2013-12-29
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多