Jawaban:
[[NSDate date] timeIntervalSince1970];
Ia mengembalikan jumlah detik sejak zaman sebagai dobel. Saya hampir yakin Anda dapat mengakses milidetik dari bagian fraksional.
[NSDate timeIntervalSinceReferenceDate]
lebih murah. (Meskipun mengacu pada "zaman" yang berbeda - jika Anda ingin tahun 1970 tambahkan konstanta NSTimeIntervalSince1970
.)
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; NSDate
menarik 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)
Saya membandingkan semua jawaban lain pada iPhone 4S dan iPad 3 (rilis rilis). CACurrentMediaTime
memiliki overhead paling kecil dengan selisih kecil. timeIntervalSince1970
jauh lebih lambat daripada yang lain, mungkin karena NSDate
overhead instantiation, meskipun mungkin tidak masalah untuk banyak kasus penggunaan.
Saya akan merekomendasikan CACurrentMediaTime
jika 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
NSTimeIntervalSince1970
makro yang merupakan yang tercepat.
NSTimeIntervalSince1970
adalah konstanta yang menggambarkan detik antara 1970-01-01 dan "tanggal referensi" (yaitu 2001-01-01), jadi selalu sama dengan 978307200
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 Date
kelas daripada 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 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);
Untuk mendapatkan milidetik untuk tanggal saat ini.
Swift 4+:
func currentTimeInMilliSeconds()-> Int
{
let currentDate = Date()
let since1970 = currentDate.timeIntervalSince1970
return Int(since1970 * 1000)
}
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/
-fno-objc-arc
jika Anda menggunakan ARC :)
// Timestamp after converting to milliseconds.
NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
Saya membutuhkan NSNumber
objek 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]
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.
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.
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)
}
func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)
}
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/
let timeInMiliSecDate = Date()
let timeInMiliSec = Int (timeInMiliSecDate.timeIntervalSince1970 * 1000)
print(timeInMiliSec)
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];