我有两个日期要比较。将来的日期和当前日期。当我比较它们时,我想检索它们在小时,分钟和秒方面的差异。我相信我必须执行的代码是正确的,但是,根据所请求的组件,我得到的返回值不同。
我将以下日历用于所有示例:
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.hour
,并且dateComponents2.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开始是正确的。
最佳答案
假设两个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秒