iPhone: Bagaimana cara mendapatkan milidetik saat ini?


Jawaban:


273
[[NSDate date] timeIntervalSince1970];

Ia mengembalikan jumlah detik sejak zaman sebagai dobel. Saya hampir yakin Anda dapat mengakses milidetik dari bagian fraksional.


29
itu tidak membunuh siapa pun untuk menulisnya seperti ini: NSTimeInterval myInterval = NSDate.timeIntervalSince1970; // semua tanda kurung itu benar-benar kuno jika Anda bertanya kepada saya.
Pizzaiola Gorgonzola

11
'tanda kurung' adalah versi sintaks yang lebih baru menurut stackoverflow.com/q/11474284/209828
Matthew

119
"tanda kurung" itu objektif-c. Jika Anda ingin mengembangkan untuk iOS, Anda mungkin harus merasa nyaman dengannya.
Ampers4nd

5
Saya telah menggunakan metode ini untuk sementara waktu dan menyadari bahwa ini dapat mengembalikan nilai sebelumnya ketika Anda memanggilnya setelah beberapa milidetik (mis. Sebut saja secara berurutan dan Anda mungkin tidak berakhir dengan urutan yang meningkat)
Ege Akpinar

5
[NSDate timeIntervalSinceReferenceDate]lebih murah. (Meskipun mengacu pada "zaman" yang berbeda - jika Anda ingin tahun 1970 tambahkan konstanta NSTimeIntervalSince1970.)
Hot Licks

311

Jika Anda ingin menggunakan ini untuk waktu relatif (misalnya untuk game atau animasi) Saya lebih suka menggunakan CACurrentMediaTime ()

double CurrentTime = CACurrentMediaTime();

Yang merupakan cara yang disarankan; NSDatemenarik dari jam sinkronisasi jaringan dan kadang-kadang akan tersendat saat menyinkronkannya kembali ke jaringan.

Ini mengembalikan waktu absolut saat ini, dalam detik.


Jika Anda hanya menginginkan bagian desimal (sering digunakan saat menyinkronkan animasi),

let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)

7
Tapi sepertinya butuh dua kali lipat waktu yang dibutuhkan untuk [[tanggal NSDate] timeIntervalSince1970]. Saya mengukur 0,065 ms vs 0,033 ms pada 15000 panggilan.
Kay

1
Catatan, Anda harus menyertakan Kerangka Kuarsa dan # impor <Quartz / CABase.h> untuk melakukan panggilan ini.
BadPirate

8
Whoops - thats import #import <QuartzCore / CAAnimation.h>
BadPirate

6
Bagi mereka yang baru mengenal Xcode (seperti saya) "termasuk Quartz Framework" berarti menambahkannya ke set perpustakaan di "Link Binary With Libraries".
Gabe Johnson

3
Jika ada yang mencari ini sehubungan dengan SpriteKit, 'waktu saat ini' dalam metode pembaruan SKScene adalah memang CACurrentMediaTime ();
Anthony Mattox

92

Saya membandingkan semua jawaban lain pada iPhone 4S dan iPad 3 (rilis rilis). CACurrentMediaTimememiliki overhead paling kecil dengan selisih kecil. timeIntervalSince1970jauh lebih lambat daripada yang lain, mungkin karena NSDateoverhead instantiation, meskipun mungkin tidak masalah untuk banyak kasus penggunaan.

Saya akan merekomendasikan CACurrentMediaTimejika Anda ingin overhead paling sedikit dan tidak keberatan menambahkan dependensi Quartz Framework. Ataugettimeofday jika portabilitas adalah prioritas bagi Anda.

iPhone 4S

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

1
1, Sementara ini jelas sangat informatif dan membantu saya tidak akan persis menyebutnya pekerjaan rekayasa besar tanpa melihat beberapa kode sumber;)
Steven Lu

2
Waspadalah terhadap masalah ini: bendodson.com/weblog/2013/01/29/ca-current-media-time Jam ini tampaknya berhenti ketika perangkat tidur.
mojuba

1
Ada NSTimeIntervalSince1970makro yang merupakan yang tercepat.
ozgur

@ozgur NSTimeIntervalSince1970adalah konstanta yang menggambarkan detik antara 1970-01-01 dan "tanggal referensi" (yaitu 2001-01-01), jadi selalu sama dengan 978307200
YourMJK

53

Di Swift kita dapat membuat fungsi dan melakukan hal berikut

func getCurrentMillis()->Int64{
    return  Int64(NSDate().timeIntervalSince1970 * 1000)
}

var currentTime = getCurrentMillis()

Meskipun ini berfungsi dengan baik di Swift 3.0 tetapi kita dapat memodifikasi dan menggunakan Datekelas daripada NSDatedi 3.0

Swift 3.0

func getCurrentMillis()->Int64 {
    return Int64(Date().timeIntervalSince1970 * 1000)
}

var currentTime = getCurrentMillis()

30

Sejauh ini saya menemukan gettimeofdaysolusi yang bagus di iOS (iPad), ketika Anda ingin melakukan evaluasi interval (misalnya, framerate, waktu bingkai render ...):

#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);

2
Saya suka ini juga karena sangat portabel. Perhatikan bahwa tergantung pada OS Anda mungkin perlu menggunakan 'long long' alih-alih 'long' dan juga membuang time.tv_sec ke 'long long' sebelum melakukan sisa perhitungan.
AbePralle

static getigntime panjang unsigned (void) {struct timeval time; gettimeofday (& waktu, NULL); return (time.tv_sec * 1000) + (time.tv_usec / 1000); }
David H

Menariknya ini bekerja dengan baik pada iPhone 5S dan Mac saya tetapi mengembalikan nilai yang salah pada iPad 3.
Hyndrix

Untuk menghindari mendapatkan angka negatif saya harus melemparkan sebelum matematika: int64_t result = ((int64_t) tv.tv_sec * 1000) + ((int64_t) tv.tv_usec / 1000);
jason gilbert

itu mengembalikan waktu di -ve
Shauket Sheikh

23

Untuk mendapatkan milidetik untuk tanggal saat ini.

Swift 4+:

func currentTimeInMilliSeconds()-> Int
    {
        let currentDate = Date()
        let since1970 = currentDate.timeIntervalSince1970
        return Int(since1970 * 1000)
    }

18

Cepat 2

let seconds = NSDate().timeIntervalSince1970
let milliseconds = seconds * 1000.0

Cepat 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds

2
TimeIntervalalias Doubletidak memiliki properti milidetik. Date().timeIntervalSince1970 * 1000
Leo Dabus

10

Mungkin bermanfaat untuk mengetahui tentang CodeTimestamps, yang menyediakan pembungkus seputar fungsi pengaturan waktu berbasis mesin. Ini memberi Anda data timing resolusi nanosecond - 1000000x lebih tepat daripada milidetik. Ya, sejuta kali lebih tepat. (Awalannya adalah mili, mikro, nano, masing-masing 1000x lebih tepat daripada yang terakhir.) Bahkan jika Anda tidak memerlukan CodeTimestamps, periksa kode (itu open source) untuk melihat bagaimana mereka menggunakan mach untuk mendapatkan data waktu. Ini akan berguna ketika Anda membutuhkan lebih banyak presisi dan menginginkan pemanggilan metode yang lebih cepat daripada pendekatan NSDate.

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


Dan Anda mungkin perlu -fno-objc-arcjika Anda menggunakan ARC :)
Dan Rosenstark


3
Kode sumber yang ditautkan dari halaman ada di sini: github.com/tylerneylon/moriarty
Tomas Andrle

8
// Timestamp after converting to milliseconds.

NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];

6

Saya membutuhkan NSNumberobjek yang berisi hasil persis [[NSDate date] timeIntervalSince1970]. Karena fungsi ini dipanggil berkali-kali dan saya tidak benar-benar perlu membuatNSDate objek, kinerjanya tidak bagus.

Jadi untuk mendapatkan format yang diberikan fungsi asli kepada saya, coba ini:

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

Yang seharusnya memberi Anda hasil yang sama persis seperti [[NSDate date] timeIntervalSince1970]


4

CFAbsoluteTimeGetCurrent ()

Waktu absolut diukur dalam detik relatif terhadap tanggal referensi absolut 1 Januari 2001 00:00:00 GMT. Nilai positif mewakili tanggal setelah tanggal referensi, nilai negatif mewakili tanggal sebelum itu. Misalnya, waktu absolut -32940326 setara dengan 16 Desember 1999 pada 17:54:34. Panggilan berulang ke fungsi ini tidak menjamin hasil yang meningkat secara monoton. Waktu sistem dapat berkurang karena sinkronisasi dengan referensi waktu eksternal atau karena perubahan jam oleh pengguna secara eksplisit.


4

Coba ini :

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;

Dalam contoh ini, dateWithTimeIntervalSince1970 digunakan dalam kombinasi formatter @ "YYYY-MM-dd HH: mm: ss.SSS" yang akan mengembalikan tanggal dengan tahun, bulan, hari dan waktu dengan jam, menit, detik, dan milidetik . Lihat contoh: "2015-12-02 04: 43: 15.008". Saya menggunakan NSString untuk memastikan bahwa format akan ditulis sebelumnya.


4

Ini pada dasarnya jawaban yang sama seperti yang diposting oleh @TristanLorach, baru saja dikodekan ulang untuk Swift 3:

   /// Method to get Unix-style time (Java variant), i.e., time since 1970 in milliseconds. This 
   /// copied from here: http://stackoverflow.com/a/24655601/253938 and here:
   /// http://stackoverflow.com/a/7885923/253938
   /// (This should give good performance according to this: 
   ///  http://stackoverflow.com/a/12020300/253938 )
   ///
   /// Note that it is possible that multiple calls to this method and computing the difference may 
   /// occasionally give problematic results, like an apparently negative interval or a major jump 
   /// forward in time. This is because system time occasionally gets updated due to synchronization 
   /// with a time source on the network (maybe "leap second"), or user setting the clock.
   public static func currentTimeMillis() -> Int64 {
      var darwinTime : timeval = timeval(tv_sec: 0, tv_usec: 0)
      gettimeofday(&darwinTime, nil)
      return (Int64(darwinTime.tv_sec) * 1000) + Int64(darwinTime.tv_usec / 1000)
   }

2
 func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)

}


1

Inilah yang saya gunakan untuk Swift

var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)

print("Time in milliseconds is \(currentTime)")

menggunakan situs ini untuk memverifikasi akurasi http://currentmillis.com/


1
let timeInMiliSecDate = Date()
let timeInMiliSec = Int (timeInMiliSecDate.timeIntervalSince1970 * 1000)
print(timeInMiliSec)

Silakan tambahkan beberapa penjelasan ke kode Anda sehingga orang lain dapat belajar darinya - terutama jika Anda memposting jawaban atas pertanyaan yang sudah memiliki banyak jawaban terunggah
Nico Haase

0

[NSDate timeIntervalSinceReferenceDate]adalah pilihan lain, jika Anda tidak ingin menyertakan kerangka kerja Quartz. Ini mengembalikan ganda, mewakili detik.


0
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];
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.