在Swift 3中获得时差

stu*_*ped 1 time calendar date swift swift3

我试图从本指南中获得两个日期的时差.我不知道该为dateComponents争论提供什么.当我直接传入时[.hour, .minute],我收到一个错误:

Playground execution failed: error: MyPlayground.playground:10:46: error: type of expression is ambiguous without more context
let timeDifference = calendar.dateComponents([.hour, .minute], from: stopTime!, to: date!)
                                             ^~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

```

我试图首先将它声明为常量但不确定类型是什么.参数是类型的Set<Calendar.Component>,但是当我试图说这是最高我得到一个错误Component,DateComponentCalendarComponent.

````

let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "hh:mm a "
let time = "12:03 pm"
let stopTime = timeFormatter.date(from: time)

let date = Date()
let calendar = Calendar.current

let components:[DateComponent] = [.hour, .minute]
let timeDifference = calendar.dateComponents(components, from: stopTime!, to: date!)
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 6

dateComponents(_:from:to:)方法声明如下:

public func dateComponents(_ components: Set<Calendar.Component>, 
    from start: Date, to end: Date) -> DateComponents
Run Code Online (Sandbox Code Playgroud)

第一个参数是类型,Set<Calendar.Components>但你似乎提供了一个[DateComponents].这就是你看错的原因.

因此,它应该这样做:

let components:[Calendar.Component] = [.hour, .minute]
let timeDifference = calendar.dateComponents(Set<Calendar.Component>(components), 
    from: stopTime!, to: date)
Run Code Online (Sandbox Code Playgroud)

首先,我将数组的类型更改为[Calendar.Component].其次,我Set<Calendar.Component>在传递components给方法之前创建了一个.另一件事是你写的date!.这!是多余的,因为date已经是非可选的.无需打开包装!

或者,您可以components完全删除变量!

let timeDifference = calendar.dateComponents([.hour, .minute], 
    from: stopTime!, to: date)
Run Code Online (Sandbox Code Playgroud)

现在编译好了!

但是,这可能不会产生您的预期结果,因为timeFormatter.date(from: time)在2000年生成了一个日期.我得到了这个非常脏的解决方案,但无论如何它仍然有效:

let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "hh:mm a"
let time = "08:00 pm"
var stopTime = timeFormatter.date(from: time)

let date = Date()
let calendar = Calendar.current

let year = calendar.component(.year, from: date)
let month = calendar.component(.month, from: date)
let day = calendar.component(.day, from: date)
let hour = calendar.component(.hour, from: stopTime!)
let minute = calendar.component(.minute, from: stopTime!)

stopTime = calendar.date(bySetting: .year, value: year, of: stopTime!)
stopTime = calendar.date(bySetting: .month, value: month, of: stopTime!)
stopTime = calendar.date(bySetting: .day, value: day, of: stopTime!)
stopTime = calendar.date(bySetting: .hour, value: hour, of: stopTime!)
stopTime = calendar.date(bySetting: .minute, value: minute, of: stopTime!)

let timeDifference = calendar.dateComponents([.hour, .minute], from: stopTime!, to: date)
Run Code Online (Sandbox Code Playgroud)