Objective-C
開始時刻を
CFTimeInterval startTime = [[NSDate date] timeIntervalSince1970];
に入れておき、必要なところで
CFTimeInterval pastTime = [[NSDate date] timeIntervalSince1970] - startTime;
で現在時刻との差を計算することで得られる。
timeIntervalSince1970はUNIXタイムとよばれる値で、1970/1/1 0:00:00からの秒数。
小数点以下もあるので、1秒以下のマイクロ秒までの管理ができる。
ここでunixTimeの値はCFAbsoluteTime型(実体はCFTimeInterval型)なので、NSDate型に直すには、以下のやり方。
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
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の関連は似たようなメソッド、プロパティ、定数などがいくつもあってわかりづらい。多分、違う書き方で同じ結果を出すものもあるんじゃないか?
0 件のコメント:
コメントを投稿