Yanıtlar:
[[NSDate date] timeIntervalSince1970];
Dönemden bu yana geçen saniye sayısını çift olarak döndürür. Milisaniyeye kesirli kısımdan erişebileceğinizden neredeyse eminim.
[NSDate timeIntervalSinceReferenceDate]
daha ucuz. (Rağmen farklı bir "çağ" referans - 1970 istiyorsanız sabit ekleyin NSTimeIntervalSince1970
.)
Eğer göreceli zamanlama (örneğin oyunlar veya animasyon için) için bunu arıyorsanız CACurrentMediaTime ()
double CurrentTime = CACurrentMediaTime();
Hangi önerilen yoludur; NSDate
ağa bağlı senkronizasyon saatinden çeker ve zaman zaman ağa yeniden senkronize ederken hıçkırır.
Geçerli mutlak zamanı saniye cinsinden döndürür.
Yalnızca ondalık bölümü istiyorsanız (genellikle animasyonları senkronize ederken kullanılır),
let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
Bir iPhone 4S ve iPad 3'teki diğer tüm cevapları (sürüm derlemeleri) karşılaştırdım. CACurrentMediaTime
küçük bir farkla en az ek yüke sahiptir. timeIntervalSince1970
büyük olasılıkla NSDate
örnekleme yükü nedeniyle diğerlerinden çok daha yavaştır , ancak birçok kullanım durumu için önemli olmayabilir.
CACurrentMediaTime
En az ek yük istiyorsanız ve Quartz Framework bağımlılığını eklemeyi düşünmüyorsanız tavsiye ederim . Veya gettimeofday
taşınabilirlik sizin için bir öncelikse.
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
en hızlı olan makro.
NSTimeIntervalSince1970
, 1970-01-01 ile "referans tarihi" (yani 2001-01-01) arasındaki saniyeleri açıklayan bir sabittir, bu nedenle her zaman 23811'de 978307200
Swift'te bir işlev yapabilir ve aşağıdaki gibi yapabiliriz
func getCurrentMillis()->Int64{
return Int64(NSDate().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Onun iyi çalışıyor olsa Swift 3.0 ama biz değiştirebilir ve kullanabilir Date
yerine sınıfını NSDate
içinde 3.0
Swift 3.0
func getCurrentMillis()->Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Şimdiye kadar gettimeofday
, bazı aralık değerlendirmeleri (örneğin, çerçeveleme, bir oluşturma çerçevesinin zamanlaması ...) yapmak istediğinizde iOS'ta (iPad) iyi bir çözüm buldum :
#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
Geçerli tarih için milisaniye almak.
Swift 4+:
func currentTimeInMilliSeconds()-> Int
{
let currentDate = Date()
let since1970 = currentDate.timeIntervalSince1970
return Int(since1970 * 1000)
}
Mach tabanlı zamanlama fonksiyonları etrafında bir sargı sağlayan CodeTimestamp'ları bilmek yararlı olabilir. Bu size nanosaniye çözünürlüklü zamanlama verisi sağlar - 1000000x milisaniyeden daha hassas. Evet, bir milyon kat daha kesin. (Ön ekler mili, mikro, nano, her biri bir öncekinden 1000 kat daha hassastır.) CodeTimestamp'lara ihtiyacınız olmasa bile, zamanlama verilerini almak için mach'ı nasıl kullandıklarını görmek için kodu (açık kaynak kodlu) kontrol edin. Daha fazla hassasiyete ihtiyaç duyduğunuzda ve NSDate yaklaşımından daha hızlı bir yöntem çağrısı istediğinizde bu yararlı olacaktır.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
-fno-objc-arc
ARC kullanıyorsanız bir ihtiyacınız olacak :)
// Timestamp after converting to milliseconds.
NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
NSNumber
Kesin sonucunu içeren bir nesneye ihtiyacım vardı [[NSDate date] timeIntervalSince1970]
. Bu işlev birçok kez çağrıldığından ve gerçekten bir NSDate
nesne oluşturmam gerekmediğinden , performans büyük değildi.
Orijinal işlevin bana verdiği biçimi almak için şunu deneyin:
#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;
Hangi ile aynı sonucu vermeli [[NSDate date] timeIntervalSince1970]
Mutlak süre, 1 Ocak 2001 00:00:00 GMT'nin mutlak referans tarihine göre saniye cinsinden ölçülür. Pozitif bir değer, referans tarihinden sonraki bir tarihi, negatif bir değer ise ondan önceki bir tarihi temsil eder. Örneğin, mutlak süre -32940326, 16 Aralık 1999'da 17:54:34'e eşdeğerdir. Bu işleve tekrar tekrar yapılan çağrılar monoton olarak artan sonuçları garanti etmez. Harici zaman referansları ile senkronizasyon veya saatin açık bir kullanıcı değişikliği nedeniyle sistem zamanı azalabilir.
Bunu dene :
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;
Bu örnekte, dateWithTimeIntervalSince1970, tarihi yıl, ay, gün ve saati saat, dakika, saniye ve milisaniye ile döndürecek olan "YYYY-AA-gg SS: sd: ss.SSS" biçimlendiricisinin kombinasyonu ile kullanılır. . Örneğe bakın: "2015-12-02 04: 43: 15.008". Biçimin daha önce yazıldığından emin olmak için NSString'i kullandım.
Bu temelde @TristanLorach tarafından gönderilen aynı cevap, sadece Swift 3 için kaydedildi:
/// 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)
}
Swift için kullandığım şey bu
var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)
print("Time in milliseconds is \(currentTime)")
bu siteyi doğruluğunu doğrulamak için kullandı 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];