NSCalendar组件返回不同的值

时间:2015-11-28 07:40:55

标签: ios cocoa-touch nsdate nscalendar

我想要比较两个日期。未来的日期和当前日期。当我比较它们时,我想要检索它们在小时,分钟和秒方面的差异。我相信我必须执行此操作的代码是正确的,但是,根据我请求的组件,我会返回不同的值。

我使用以下日历表示所有示例:

let calendar = NSCalendar.currentCalendar()

A:

let dateComponents = calendar.components([NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Second, NSCalendarUnit.Minute], fromDate: NSDate(), toDate: date, options: [])

B:

let dateComponents2 = calendar.components(.Hour, fromDate: NSDate(), toDate: date, options: [])

因此,通过上面的示例,dateComponents.hour 不等于dateComponents2.hourdateComponents2.hour返回正确的值。

更有趣的是以下案例:

A:

let dateComponents = calendar.components([NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Second, NSCalendarUnit.Minute], fromDate: NSDate(), toDate: date, options: [])

B:

let dateComponents2 = calendar.components(.Minute, fromDate: NSDate(), toDate: date, options: [])

现在,dateComponents.minute 不等于dateComponents2.minute,但现在dateComponents.minute会返回正确的值。

为什么会发生这种情况?我同时请求多个组件的事实会影响返回值吗?

修改 以下是使用以下日期的一些示例。返回值显示为小时,分钟,秒:

2015-11-29 10:59:00 +0000

2015-11-28 07:57:20 +0000

使用dateComponents:

3,1,39

使用dateComponents2(每个组件一个):

27,1621,97299

dateComponents2的小时值是正确的,而dateComponents的分钟和秒值是正确的。

1 个答案:

答案 0 :(得分:1)

让我们想象两个NSDate对象相隔61秒,如果你同时获得分钟和秒,你得到1分1秒,但如果你只是要求秒,你得到61秒:

let date1 = NSDate()
let date2 = date1.dateByAddingTimeInterval(61)

let calendar = NSCalendar.currentCalendar()
let components1 = calendar.components([.Minute, .Second], fromDate: date1, toDate: date2, options: [])
let components2 = calendar.components([.Second], fromDate: date1, toDate: date2, options: [])

print("\(components1.minute) minute and \(components1.second) second")
print("\(components2.second) seconds")

产量:

  

1分1秒
  61秒

使用您的日期(并在计算中添加天数和小时数):

let dateString1 = "2015-11-28 07:57:20 +0000"
let dateString2 = "2015-11-29 10:59:00 +0000"

let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"

let date1 = formatter.dateFromString(dateString1)!
let date2 = formatter.dateFromString(dateString2)!

let calendar = NSCalendar.currentCalendar()
let components1 = calendar.components([.Day, .Hour, .Minute, .Second], fromDate: date1, toDate: date2, options: [])
let components2 = calendar.components([.Second], fromDate: date1, toDate: date2, options: [])

print("\(components1.day) day, \(components1.hour) hours, \(components1.minute) minute, and \(components1.second) seconds")
print("\(components2.second) seconds")

产量:

  

1天,3小时,1分钟和40秒
  97300秒

如果你将其乘以,你会发现1天,3小时,1分40秒等于97300秒。

您还可以考虑使用NSDateComponentsFormatter创建经过时间的格式化(和本地化)的字符串表示形式:

let componentsFormatter = NSDateComponentsFormatter()
componentsFormatter.allowedUnits = [.Day, .Hour, .Minute, .Second]
componentsFormatter.unitsStyle = .Full
print(componentsFormatter.stringFromDate(date1, toDate: date2))

// or just show the top two units (because if you're showing days/hours, you probably no longer care about minutes/seconds

componentsFormatter.maximumUnitCount = 2
print(componentsFormatter.stringFromDate(date1, toDate: date2))

// but if you want actual total number of seconds, then change `allowedUnits` to use only that

componentsFormatter.allowedUnits = [.Second]
print(componentsFormatter.stringFromDate(date1, toDate: date2))

这将显示三个可选字符串:

  

1天,3小时,1分钟,40秒
  1天3小时   97,300秒