web-dev-qa-db-ja.com

Swiftを使用して、整数としてNSDates間の秒の差を見つけます

ボタンを押している時間を計りたいコードを書いています。そのために、ボタンを押したときにNSDate()を記録し、ボタンを離したときにtimeIntervalSinceDate関数を使用してみました。それはうまくいくようですが、結果を印刷したり、整数に切り替える方法が見つかりません。

var timeAtPress = NSDate() 

@IBAction func pressed(sender: AnyObject) {
    println("pressed")
    timeAtPress = NSDate()
}

@IBAction func released(sender: AnyObject) {
    println("released")
    var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
    duration = ???
}

同様の質問をいくつか見ましたが、Cがわからないので、与えられた答えを理解するのに苦労しました。ボタンが押されている時間を確認するより効率的な方法があれば、提案を受け付けています。前もって感謝します。

90
Erik

elapsedTimeを計算する試みは正しくありません。 Swift 3では、次のようになります。

let elapsed = Date().timeIntervalSince(timeAtPress)

Date参照の後の()に注意してください。 Date()は新しい日付オブジェクトをインスタンス化し、timeIntervalSinceはその変数とtimeAtPressとの時間差を返します。それは浮動小数点値を返します(技術的にはTimeInterval)。

それをInt値に切り捨てる場合は、次のように使用できます。

let duration = Int(elapsed)

ところで、timeAtPress変数の定義では、Dateオブジェクトをインスタンス化する必要はありません。私はあなたが意図したと思います:

var timeAtPress: Date!

これは、変数をDate変数(暗黙的にラップされていない変数)として定義しますが、おそらくpressedが呼び出されるまで、その変数の実際のインスタンス化を延期するでしょう。


あるいは、私はしばしば CFAbsoluteTimeGetCurrent() を使用します。

var start: CFAbsoluteTime!

そして、startTimeを設定したい場合、次のようにします。

start = CFAbsoluteTimeGetCurrent()

そして、経過した秒数を計算したい場合、次のようにします。

let elapsed = CFAbsoluteTimeGetCurrent() - start

CFAbsoluteTimeGetCurrent のドキュメントで警告されていることに注意してください:

この関数を繰り返し呼び出しても、結果が単調に増加することは保証されません。システム時刻は、外部時刻参照との同期、またはユーザーによるクロックの明示的な変更により減少する場合があります。

これは、これらの調整のいずれかが行われたときに経過時間を測定するのに十分な不幸がある場合、誤った経過時間の計算になる可能性があることを意味します。これはNSDate/Date計算にも当てはまります。 mach_absolute_timeベースの計算を使用するのが最も安全です( CACurrentMediaTime で最も簡単に実行できます):

let start = CACurrentMediaTime()

そして

let elapsed = CACurrentMediaTime() - start

これはmach_absolute_timeを使用しますが、 Technical Q&A QA1398 で概説されている複雑さの一部を回避します。

ただし、CACurrentMediaTime/mach_absolute_timeは、デバイスの再起動時にリセットされることに注意してください。要するに、アプリの実行中に正確な経過時間の計算が必要な場合は、CACurrentMediaTimeを使用してください。ただし、将来のある日にアプリが再起動されたときに思い出すかもしれない永続的なストレージにこの開始時間を保存する場合は、DateまたはCFAbsoluteTimeGetCurrentを使用する必要があります。

188
Rob

NSDate()とNSCalendar()は良い選択のように聞こえます。カレンダー計算を使用し、実際の数学部分はフレームワークに任せます。 2つのNSDate()の間の秒を取得する簡単な例を次に示します

let startDate = NSDate()
let endDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let dateComponents = calendar.components(NSCalendarUnit.CalendarUnitSecond, fromDate: startDate, toDate: endDate, options: nil)
let seconds = dateComponents.second
println("Seconds: \(seconds)")
21
Freddy

フレディの答えによれば、これはSwift 3の関数です。

let start = Date()
        let enddt = Date(timeIntervalSince1970: 100)
        let calendar = Calendar.current
        let unitFlags = Set<Calendar.Component>([ .second])
        let datecomponenets = calendar.dateComponents(unitFlags, from: start, to: enddt)
        let seconds = datecomponenets.second
        print("Seconds: \(seconds)")
7

スイフト5

    let startDate = Date()
    let endDate = Date()
    let calendar = Calendar.current
    let dateComponents = calendar.compare(startDate, to: endDate, toGranularity: .second)
    let seconds = dateComponents.rawValue
    print("Seconds: \(seconds)")
2
Ahmed Safadi

これは、Swift 3の最新バージョンの違いを取得する方法です。

let calendar = NSCalendar.current
var compos:Set<Calendar.Component> = Set<Calendar.Component>()
compos.insert(.second)
compos.insert(.minute)
let difference = calendar.dateComponents(compos, from: fromDate, to: toDate)
print("diff in minute=\(difference.minute!)") // difference in minute
print("diff in seconds=\(difference.second!)") // difference in seconds

リファレンス: (月/日/時間/分/秒)の2つのNSDatesの差を取得する

0
Rujoota Shah