ボタンを押している時間を計りたいコードを書いています。そのために、ボタンを押したときに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がわからないので、与えられた答えを理解するのに苦労しました。ボタンが押されている時間を確認するより効率的な方法があれば、提案を受け付けています。前もって感謝します。
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
を使用する必要があります。
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)")
フレディの答えによれば、これは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)")
スイフト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)")
これは、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の差を取得する