2015年4月3日金曜日

経過時間の計算

Objective-C

開始時刻を
CFTimeInterval startTime = [[NSDate date] timeIntervalSince1970];
に入れておき、必要なところで
CFTimeInterval pastTime = [[NSDate date] timeIntervalSince1970] - startTime;
で現在時刻との差を計算することで得られる。

timeIntervalSince1970はUNIXタイムとよばれる値で、1970/1/1 0:00:00からの秒数。
小数点以下もあるので、1秒以下のマイクロ秒までの管理ができる。


Swift

開始時刻を得る
let startTime = CFAbsoluteTimeGetCurrent()
2001年1月1日0時0分0秒からの経過秒数として得られる。
単にある基準時刻からの経過秒数を得るのであれば、これを利用して計算すればよい。
let pastTime = CFAbsoluteTimeGetCurrent() - startTime

UNIXタイムに変換するには、1970年1月1日0時0分0秒 〜 2001年1月1日0時0分0秒までの経過秒数が以下の定数に定義されているので、startTimeに加えてやれば良い。
kCFAbsoluteTimeIntervalSince1970

let unixTime = CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970

ここでunixTimeの値はCFAbsoluteTime型(実体はCFTimeInterval型)なので、NSDate型に直すには、以下のやり方。
let date = NSDate.init(timeIntervalSince1970:(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970))
このinitはSwiftのコンビニエンスイニシャライザで、Objective-CのinitWithTimeIntervalSince1970に相当する。
Swiftは、引数の型や数が違えば同名の関数を複数定義できる。さらにその中から別の同名のイニシャライザを呼んでいる関数を、コンビニエンスイニシャライザという。

SwiftではObjective-CみたいにinitWith〜と書かずに全てinitになるので、クラスリファレンスでObjective-Cに相当するメソッドを探す時は、Swiftのinitを探さず、Objective-CのinitWith〜とかを探す必要があるので注意だ。


timeIntervalの関連は似たようなメソッド、プロパティ、定数などがいくつもあってわかりづらい。多分、違う書き方で同じ結果を出すものもあるんじゃないか?