Apa cara terbaik untuk mendapatkan sistem saat ini waktu milidetik?
Jika anda're melihat menggunakan ini untuk waktu relatif (misalnya untuk permainan atau animasi) I'd suka menggunakan CACurrentMediaTime()
double CurrentTime = CACurrentMediaTime();
Yang merupakan cara yang dianjurkan; NSDate
menarik dari jaringan selaras-jam dan kadang-kadang akan cegukan ketika re-sync itu terhadap jaringan.
Kembali saat ini waktu mutlak, dalam hitungan detik.
Jika anda ingin hanya desimal bagian (sering digunakan ketika sinkronisasi animasi),
let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
Saya mengacu semua jawaban yang lain pada iPhone 4S dan iPad 3 (rilis membangun). CACurrentMediaTime
memiliki sedikit overhead dengan margin kecil. timeIntervalSince1970
adalah jauh lebih lambat dari yang lain, mungkin karena NSDate
instansiasi overhead, meskipun hal ini mungkin tidak masalah bagi banyak kasus penggunaan.
I'd merekomendasikan CACurrentMediaTime
jika anda ingin sedikit overhead dan don't pikiran menambahkan Kuarsa Kerangka ketergantungan. Atau gettimeofday
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
Di Swift kita dapat membuat fungsi dan lakukan sebagai berikut
func getCurrentMillis()->Int64{
return Int64(NSDate().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Meskipun bekerja dengan baik di Swift 3.0 tapi kita dapat memodifikasi dan menggunakan Tanggal
kelas bukan NSDate
di 3.0
Swift 3.0
func getCurrentMillis()->Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Sejauh ini saya menemukan gettimeofday
solusi yang baik pada iOS (iPad), bila anda ingin melakukan beberapa interval evaluasi (katakanlah, framerate, waktu rendering frame...) :
#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
Untuk mendapatkan milidetik untuk tanggal saat ini.
Swift 4+:
func currentTimeInMilliSeconds()-> Int
{
let currentDate = Date()
let since1970 = currentDate.timeIntervalSince1970
return Int(since1970 * 1000)
}
Ini mungkin berguna untuk mengetahui tentang CodeTimestamps, yang memberikan bungkus sekitar mach-berdasarkan fungsi waktu. Ini memberi anda nanodetik-resolusi data waktu - 1000000x lebih tepat dari milidetik. Ya, satu juta kali lebih tepat. (Prefiks adalah mili, micro, nano, masing-masing 1000x lebih tepat daripada yang terakhir.) Bahkan jika anda don't perlu CodeTimestamps, check out kode (it's open source) untuk melihat bagaimana mereka menggunakan mach untuk mendapatkan data waktu. Ini akan berguna ketika anda membutuhkan lebih presisi dan ingin metode yang lebih cepat panggilan dari NSDate pendekatan.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
Aku butuh NSNumber
objek yang berisi hasil yang tepat dari [[NSDate tanggal] timeIntervalSince1970]
. Karena fungsi ini dipanggil berkali-kali dan saya didn't benar-benar perlu untuk membuat sebuah NSDate
objek, kinerja tidak bagus.
Jadi untuk mendapatkan format yang asli fungsi memberi saya, coba ini:
#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;
Yang harus memberikan anda hasil yang sama persis seperti [[NSDate tanggal] timeIntervalSince1970]
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 date 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 telah ditulis sebelumnya.
waktu Mutlak diukur dalam detik relatif terhadap referensi absolut tanggal 1 Januari 2001 00:00:00 GMT. Nilai positif menunjukkan suatu tanggal setelah tanggal referensi, nilai negatif menunjukkan tanggal sebelum itu. Misalnya, waktu mutlak -32940326 setara dengan 16 desember 1999 pada 17:54:34. Panggilan berulang-ulang untuk fungsi ini tidak menjamin monoton meningkatkan hasil. Sistem waktu dapat berkurang karena sinkronisasi dengan waktu eksternal referensi atau karena eksplisit pengguna mengubah jam.
Ini pada dasarnya adalah jawaban yang sama seperti yang diposting oleh @TristanLorach, hanya recoded 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)
}
Ini adalah apa yang saya digunakan 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/
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];