246

現在のシステム時間のミリ秒を取得する最良の方法は何ですか?

4

18 に答える 18

323

これを相対的なタイミング (ゲームやアニメーションなど) に使用する場合は、むしろCACurrentMediaTime()を使用します

double CurrentTime = CACurrentMediaTime();

これは推奨される方法です。NSDateネットワーク化された同期クロックから取得し、ネットワークに対して再同期するときに時折中断します。

現在の絶対時間を秒単位で返します。


小数部分のみが必要な場合(アニメーションを同期するときによく使用されます)、

let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
于 2010-04-30T05:03:12.507 に答える
282
[[NSDate date] timeIntervalSince1970];

エポックからの秒数を倍精度で返します。小数部分からミリ秒にアクセスできるとほぼ確信しています。

于 2008-12-11T01:39:48.910 に答える
98

私はiPhone4SとiPad3(リリースビルド)で他のすべての答えをベンチマークしました。CACurrentMediaTimeわずかなマージンでオーバーヘッドが最小になります。多くのユースケースでは問題にならないかもしれませんが、おそらくインスタンス化のオーバーヘッドがtimeIntervalSince1970原因で、他のものよりもはるかに低速です。NSDate

CACurrentMediaTimeオーバーヘッドを最小限に抑え、QuartzFrameworkの依存関係を追加してもかまわない場合はお勧めします。またはgettimeofday、移植性が優先される場合。

アイフォーン4エス

CACurrentMediaTime: 1.33 µs/call
gettimeofday: 1.38 µs/call
[NSDate timeIntervalSinceReferenceDate]: 1.45 µs/call
CFAbsoluteTimeGetCurrent: 1.48 µs/call
[[NSDate date] timeIntervalSince1970]: 4.93 µs/call

iPad 3

CACurrentMediaTime: 1.25 µs/call
gettimeofday: 1.33 µs/call
CFAbsoluteTimeGetCurrent: 1.34 µs/call
[NSDate timeIntervalSinceReferenceDate]: 1.37 µs/call
[[NSDate date] timeIntervalSince1970]: 3.47 µs/call
于 2012-08-18T16:35:58.717 に答える
31

これまでのところgettimeofday、間隔評価(フレームレート、レンダリングフレームのタイミングなど)を実行したい場合に、iOS(iPad)で良い解決策を見つけました:

#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
于 2011-10-25T07:23:03.943 に答える
10

マッハベースのタイミング関数のラッパーを提供するCodeTimestampsについて知っておくと便利な場合があります。これにより、ナノ秒の解像度のタイミングデータが得られます。ミリ秒よりも1000000倍正確です。はい、100万倍正確です。(プレフィックスはミリ、マイクロ、ナノで、それぞれが最後の1000倍正確です。)CodeTimestampsが必要ない場合でも、コード(オープンソース)をチェックして、マッハを使用してタイミングデータを取得する方法を確認してください。これは、NSDateアプローチよりも高い精度が必要で、より高速なメソッド呼び出しが必要な場合に役立ちます。

http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/

于 2011-06-27T23:45:01.260 に答える
8
// Timestamp after converting to milliseconds.

NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
于 2014-09-24T12:28:44.050 に答える
6

NSNumberの正確な結果を含むオブジェクトが必要でした[[NSDate date] timeIntervalSince1970]。この関数は何度も呼び出され、実際にはNSDateオブジェクトを作成する必要がなかったため、パフォーマンスは良くありませんでした。

したがって、元の関数が私に与えていた形式を取得するには、これを試してください:

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;

とまったく同じ結果が得られるはずです[[NSDate date] timeIntervalSince1970]

于 2013-05-11T09:38:28.777 に答える
4

これを試して :

NSDate * timestamp = [NSDate dateWithTimeIntervalSince1970:[[NSDate date] timeIntervalSince1970]];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss.SSS"];

NSString *newDateString = [dateFormatter stringFromDate:timestamp];
timestamp = (NSDate*)newDateString;

この例では、dateWithTimeIntervalSince1970 がフォーマッタ @"YYYY-MM-dd HH:mm:ss.SSS" と組み合わせて使用​​され、年、月、日で日付を返し、時、分、秒、ミリ秒で時刻を返します。 . 例を参照してください:「2015-12-02 04:43:15.008」。NSString を使用して、フォーマットが以前に書き込まれたことを確認しました。

于 2015-12-02T14:16:40.090 に答える
1
NSTimeInterval time = ([[NSDate date] timeIntervalSince1970]); //double
long digits = (long)time; //first 10 digits        
int decimalDigits = (int)(fmod(time, 1) * 1000); //3 missing digits
/*** long ***/
long timestamp = (digits * 1000) + decimalDigits;
/*** string ***/
NSString *timestampString = [NSString stringWithFormat:@"%ld%03d",digits ,decimalDigits];
于 2018-01-11T11:31:31.517 に答える
0

[NSDate timeIntervalSinceReferenceDate]Quartz フレームワークを含めたくない場合は、別のオプションです。秒を表す double を返します。

于 2011-04-05T01:33:34.390 に答える