iPhone: Güncel milisaniye nasıl alınır?


Yanıtlar:


274
[[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.


29
böyle yazmak için kimseyi öldürmez: NSTimeInterval myInterval = NSDate.timeIntervalSince1970; // bana sorarsanız tüm bu parantezler gerçekten eski moda.
Pizzaiola Gorgonzola


119
"bu parantezler" objektif-c'dir. İOS için geliştirmek istiyorsanız, muhtemelen onlarla rahat olmalısınız.
Ampers4.

5
Bir süredir bu yöntemi kullanıyorum ve birkaç milisaniyeden sonra çağırdığınızda daha önceki bir değeri döndürebileceğini fark ettim (örneğin arka arkaya arayın ve artan bir sekansla sonuçlanmayabilirsiniz)
Ege Akpinar

5
[NSDate timeIntervalSinceReferenceDate]daha ucuz. (Rağmen farklı bir "çağ" referans - 1970 istiyorsanız sabit ekleyin NSTimeIntervalSince1970.)
Hot Licks

311

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; NSDateağ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)

7
Ancak, [[NSDate date] timeIntervalSince1970] için gereken sürenin iki katını alıyor gibi görünüyor. 15000 çağrıda 0,065 ms'ye karşılık 0,033 ms ölçtüm.
Kay

1
Bu çağrıyı yapmak için Quartz Framework ve #import <Quartz / CABase.h> ifadelerini eklemeniz gerekir.
BadPirate

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

6
Xcode'a yeni gelenler için (benim gibi) "Quartz Framework'ü ekle", "İkili Kitaplıklarıyla Bağla" daki kitaplık kümesine eklemek anlamına gelir.
Gabe Johnson

3
SpriteKit ile ilgili olarak bunu arayan varsa, SKScene'in güncelleme yöntemindeki 'şimdiki zaman' gerçekten CACurrentMediaTime ();
Anthony Mattox

92

Bir iPhone 4S ve iPad 3'teki diğer tüm cevapları (sürüm derlemeleri) karşılaştırdım. CACurrentMediaTimeküçük bir farkla en az ek yüke sahiptir. timeIntervalSince1970bü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.

CACurrentMediaTimeEn az ek yük istiyorsanız ve Quartz Framework bağımlılığını eklemeyi düşünmüyorsanız tavsiye ederim . Veya gettimeofdaytaşı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

1
+1, Açıkçası çok bilgilendirici ve yararlı olsa da, bazı kaynak kodlarını görmeden tam olarak büyük mühendislik çalışmaları
Steven Lu

2
Yine de bu soruna dikkat edin: bendodson.com/weblog/2013/01/29/ca-current-media-time Bu saat, cihaz uyku moduna geçtiğinde açıkça durur.
mojuba

1
Orada NSTimeIntervalSince1970en hızlı olan makro.
ozgur

@ozgur 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
YourMJK

53

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 Dateyerine sınıfını NSDateiçinde 3.0

Swift 3.0

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

var currentTime = getCurrentMillis()

30

Ş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);

2
Çok taşınabilir olduğu için bunu seviyorum. İşletim sistemine bağlı olarak, hesaplamanın geri kalanını yapmadan önce 'uzun' yerine 'uzun uzun' kullanmanız ve benzer şekilde bir time.tv_sec kullanmanız gerekebileceğini unutmayın.
AbePralle

statik işaretsiz uzun getMStime (geçersiz) {struct timeval time; gettimeofday (& time, NULL); dönüş (time.tv_sec * 1000) + (time.tv_usec / 1000); }
David H

İlginçtir, bu iPhone 5S ve
Mac'imde

Negatif sayılar elde etmekten kaçınmak için matematikten önce yayınlamak zorunda kaldım: int64_t sonuç = ((int64_t) tv.tv_sec * 1000) + ((int64_t) tv.tv_usec / 1000);
jason gilbert


23

Geçerli tarih için milisaniye almak.

Swift 4+:

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

18

Hızlı 2

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

Hızlı 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds

2
TimeIntervalaka Doublemilisaniye özelliği yoktur. Date().timeIntervalSince1970 * 1000
Leo Dabus

10

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/


Ve muhtemelen -fno-objc-arcARC kullanıyorsanız bir ihtiyacınız olacak :)
Dan Rosenstark



8
// Timestamp after converting to milliseconds.

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

6

NSNumberKesin 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 NSDatenesne 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]


4

CFAbsoluteTimeGetCurrent ()

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.


4

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.


4

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)
   }

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

}


1

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/


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

Lütfen kodunuza başkalarının ondan öğrenebilecekleri bir açıklama ekleyin - özellikle zaten çok sayıda cevaplandırılmış cevabı olan bir soruya cevap gönderirseniz
Nico Haase

0

[NSDate timeIntervalSinceReferenceDate]Quartz çerçevesini dahil etmek istemiyorsanız başka bir seçenektir. Saniyeyi temsil eden bir çift döndürür.


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];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.