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.

codelogic
sumber
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)
Allan Simonsen
sumber
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
darrinm
sumber
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()
Rajan Maheshwari
sumber
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);
Tristan Lorach
sumber
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)
    }
Rajesh Loganathan
sumber
18

Cepat 2

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

Cepat 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds
unik
sumber
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/

Tyler
sumber
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]];
Fatima Arshad
sumber
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]

mmackh
sumber
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.

Inder Kumar Rathore
sumber
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.

ΩlostA
sumber
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)
   }
RenniePet
sumber
2
 func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)

}

Softlabsindia
sumber
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/

DG7
sumber
1
let timeInMiliSecDate = Date()
let timeInMiliSec = Int (timeInMiliSecDate.timeIntervalSince1970 * 1000)
print(timeInMiliSec)
lazyTank
sumber
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.

Chris
sumber
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];
VERMA PANKAJ
sumber