【问题标题】:Getting time difference in Swift 3在 Swift 3 中获取时差
【发布时间】:2017-04-04 04:36:23
【问题描述】:

我试图从这个guide 获取两个日期的时差。我不确定为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!)
                                             ^~~~~~~~~~~~~~~~

```

我首先尝试将其声明为常量,但不确定类型是什么。参数的类型为Set<Calendar.Component>,但当我尝试说它是向上ComponentDateComponentCalendarComponent 时出现错误。

````

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!)

【问题讨论】:

    标签: swift date time calendar swift3


    【解决方案1】:

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

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

    第一个参数是Set&lt;Calendar.Components&gt; 类型,但您似乎提供了[DateComponents]。这就是您看到错误的原因。

    因此,应该这样做:

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

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

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

    let timeDifference = calendar.dateComponents([.hour, .minute], 
        from: stopTime!, to: date)
    

    现在可以正常编译了!

    但是,这可能不会产生您预期的结果,因为 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)
    

    【讨论】:

    • 您无需显式创建Set&lt;Calendar.Component&gt;。尝试在您的代码中将Set&lt;Calendar.Component&gt;(components) 替换为[.hour, .minute]
    • 哦,是的!我从来不知道[] 也可以表示Set。 @OOPer
    • 请注意,OP 的问题是由 date! 中的 ! 引起的。
    • @stumpedOh 我没有意识到这一点!我更新了答案。看看吧!
    • @stumped 请记住,这仅在您比较的两次时间在同一天时才有效。
    【解决方案2】:

    Swift 3.0

    let start = Date();
    //Your functions..
    let end = Date();
    print("Time to do something: \(end.timeIntervalSince(start)) seconds");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多