iPhone: वर्तमान मिलीसेकंड कैसे प्राप्त करें?


225

वर्तमान प्रणाली समय मिलीसेकंड प्राप्त करने का सबसे अच्छा तरीका क्या है?

जवाबों:


273
[[NSDate date] timeIntervalSince1970];

यह एक डबल के रूप में युग के बाद से सेकंड की संख्या देता है। मुझे लगभग यकीन है कि आप अंश भाग से मिलीसेकंड तक पहुंच सकते हैं।


29
यह इस तरह से लिखने के लिए किसी को नहीं मारता है: NSTimeInterval myInterval = NSDate.timeIntervalSince1970; // उन सभी कोष्ठक वास्तव में पुराने जमाने के हैं यदि आप मुझसे पूछें।
पिजायोला गोरगोन्जोला


119
"वे कोष्ठक" उद्देश्य-सी हैं। यदि आप iOS के लिए विकसित करना चाहते हैं, तो आपको शायद उनके साथ सहज होना चाहिए।
एम्परसेंड ४

5
मैं थोड़ी देर के लिए इस पद्धति का उपयोग कर रहा हूं और यह महसूस करने लगा कि यह पहले के मूल्य को वापस कर सकता है जब आप इसे दो मील के बाद कहते हैं (जैसे कि इसे लगातार कॉल करें और आप एक बढ़ते क्रम के साथ समाप्त नहीं हो सकते हैं)
इजे अकपिनार

5
[NSDate timeIntervalSinceReferenceDate]सस्ता है। (हालांकि यह एक अलग "युग" का संदर्भ देता है - यदि आप 1970 को निरंतर जोड़ना चाहते हैं NSTimeIntervalSince1970।)
हॉट लिक्स

311

यदि आप इसे सापेक्ष समय के लिए उपयोग कर रहे हैं (उदाहरण के लिए खेल या एनीमेशन के लिए) तो मैं CACurrentMediaTime () का उपयोग करूँगा

double CurrentTime = CACurrentMediaTime();

यह अनुशंसित तरीका है; NSDateनेटवर्क वाली सिंक-क्लॉक से ड्रॉ होता है और कभी-कभी हिचकी आएगी जब इसे नेटवर्क के खिलाफ फिर से सिंक किया जाएगा।

यह वर्तमान निरपेक्ष समय, सेकंड में वापस करता है।


यदि आप केवल दशमलव भाग चाहते हैं (अक्सर एनिमेशन को सिंक्रनाइज़ करते समय उपयोग किया जाता है),

let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)

7
लेकिन [[NSDate date] timeIntervalSince1970] के लिए ज़रूरी समय से दोगुना समय लगता है। मैंने 15000 कॉल पर 0.065ms बनाम 0.033ms मापा।
काय

1
ध्यान दें, इस कॉल को करने के लिए आपको क्वार्ट्ज फ्रेमवर्क और #import <क्वार्ट्ज / CABase.h> को शामिल करना होगा।
बैडपिरेट

8
व्हाट्स
व्हाट्सएप

6
Xcode (मेरे जैसे) के नए लोगों के लिए "क्वार्ट्ज फ्रेमवर्क शामिल करें" का अर्थ है "लिंक बाइनरी विद लाइब्रेरीज़" में पुस्तकालयों के सेट में इसे जोड़ना।
गाबे जॉनसन

3
स्प्राइटकिट के संबंध में अगर किसी की तलाश है, तो SKScene की अपडेट पद्धति में 'वर्तमान समय' वास्तव में CACurrentMediaTime () है;
एंथनी मैटॉक्स

92

मैंने iPhone 4S और iPad 3 (रिलीज़ बिल्ड) पर अन्य सभी जवाब दिए। CACurrentMediaTimeएक छोटे अंतर से कम से कम ओवरहेड है। timeIntervalSince1970दूसरों की तुलना में बहुत धीमा है, शायद NSDateतात्कालिक ओवरहेड के कारण , हालांकि यह कई उपयोग के मामलों के लिए मायने नहीं रखता है।

CACurrentMediaTimeयदि आप कम से कम ओवरहेड चाहते हैं तो मैं सलाह दूंगा और क्वार्ट्ज फ्रेमवर्क निर्भरता को जोड़ने में कोई आपत्ति नहीं। या gettimeofdayयदि पोर्टेबिलिटी आपके लिए प्राथमिकता है।

आईफ़ोन 4 स

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

आईपैड 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, जबकि यह स्पष्ट रूप से बहुत जानकारीपूर्ण और उपयोगी है, मैं कुछ स्रोत कोड देखे बिना इसे महान इंजीनियरिंग कार्य नहीं कहूंगा;)
स्टीवन लू

2
हालांकि इस समस्या से सावधान रहें: bendodson.com/weblog/2013/01/29/ca-current-media-time यह घड़ी स्पष्ट रूप से तब बंद हो जाती है जब डिवाइस सो जाती है।
मोजुबा

1
नहीं है NSTimeIntervalSince1970मैक्रो जो सबसे तेज है।
ozgur

@ozgur 1970-01-01 NSTimeIntervalSince1970और "संदर्भ तिथि" (यानी 2001-01-01) के बीच के सेकंड का वर्णन करने वाला एक निरंतर है, इसलिए यह हमेशा 978307200 के बराबर है
YourMJK

53

स्विफ्ट में हम एक फंक्शन कर सकते हैं और निम्नानुसार कर सकते हैं

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

var currentTime = getCurrentMillis()

अपने में काम हालांकि ठीक स्विफ्ट 3.0 लेकिन हम को संशोधित करने और उपयोग कर सकते हैं Dateके बजाय वर्ग NSDateमें 3.0

स्विफ्ट 3.0

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

var currentTime = getCurrentMillis()

30

अब तक मुझे gettimeofdayiOS (iPad) पर एक अच्छा समाधान मिला , जब आप कुछ अंतराल मूल्यांकन करना चाहते हैं (कहते हैं, फ्रैमरेट, एक रेंडरिंग फ्रेम का समय ...):

#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);

2
मुझे यह बहुत पसंद है क्योंकि यह बहुत पोर्टेबल है। ध्यान दें कि OS पर निर्भर करता है कि आपको शेष गणना करने से पहले 'long' के बजाय 'long long' का उपयोग करना होगा और इसी तरह time.tv_sec को 'long long' करना होगा।
अबेप्राल्ले

स्थिर अहस्ताक्षरित लंबे getMStime (शून्य) {संरचनात्मक समय अंतराल; gettimeofday (और समय, NULL); वापसी (time.tv_sec * 1000) + (time.tv_usec / 1000); }
डेविड एच।

दिलचस्प बात यह है इस अपने iPhone 5 एस और मैक पर ठीक काम करता है, लेकिन एक iPad 3. पर एक गलत मान देता है
Hyndrix

नकारात्मक संख्या प्राप्त करने से बचने के लिए मुझे गणित से पहले कास्ट करना पड़ा: int64_t result = ((int64_t) tv.tv_sec * 1000) + ((int64_t) tv.tv_usec / 1000);
जेसन गिल्बर्ट

यह लौटने का समय -ve
शौकत शेख

23

वर्तमान तिथि के लिए मिलीसेकंड प्राप्त करने के लिए।

स्विफ्ट 4+:

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

18

स्विफ्ट 2

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

स्विफ्ट 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds

2
TimeIntervalउर्फ के Doubleपास मिलीसेकंड की संपत्ति नहीं है। Date().timeIntervalSince1970 * 1000
लियो डबस 16

10

CodeTimestamps के बारे में जानना उपयोगी हो सकता है, जो मच-आधारित टाइमिंग फ़ंक्शन के आसपास एक आवरण प्रदान करता है। यह आपको नैनोसेकंड-रिज़ॉल्यूशन टाइमिंग डेटा देता है - मिलीसेकंड की तुलना में 1000000x अधिक सटीक। हां, एक लाख गुना ज्यादा सटीक। (उपसर्ग मिलि, माइक्रो, नैनो हैं, प्रत्येक 1000x पिछले की तुलना में अधिक सटीक।) भले ही आपको CodeTimestamps की आवश्यकता न हो, कोड की जाँच करें (यह खुला स्रोत है) यह देखने के लिए कि वे समय डेटा प्राप्त करने के लिए कैसे उपयोग करते हैं। यह तब उपयोगी होगा जब आपको अधिक सटीकता की आवश्यकता हो और NSDate दृष्टिकोण की तुलना में तेज़ विधि कॉल करना चाहिए।

http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/


और आपको शायद जरूरत होगी -fno-objc-arcअगर आप ARC :)
Dan Rosenstark


3
पृष्ठ से जुड़ा स्रोत कोड यहाँ है: github.com/tylerneylon/moriarty
टॉमस आंद्रेल


6

मुझे एक NSNumberवस्तु की आवश्यकता थी जिसके सटीक परिणाम हो [[NSDate date] timeIntervalSince1970]। चूंकि इस फ़ंक्शन को कई बार बुलाया गया था और मुझे वास्तव में एक NSDateऑब्जेक्ट बनाने की आवश्यकता नहीं थी, प्रदर्शन बहुत अच्छा नहीं था।

इसलिए यह प्रारूप प्राप्त करने के लिए कि मूल फ़ंक्शन मुझे दे रहा था, यह प्रयास करें:

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;

जो आपको जैसा चाहिए वैसा ही परिणाम दें [[NSDate date] timeIntervalSince1970]


4

CFAbsoluteTimeGetCurrent ()

निरपेक्ष समय 1 जनवरी 2001 00:00:00 GMT की पूर्ण संदर्भ तिथि के सापेक्ष सेकंड में मापा जाता है। एक सकारात्मक मूल्य संदर्भ तिथि के बाद की तारीख का प्रतिनिधित्व करता है, एक नकारात्मक मूल्य इससे पहले की तारीख का प्रतिनिधित्व करता है। उदाहरण के लिए, पूर्ण समय -32940326 16 दिसंबर, 1999 को 17:54:34 के बराबर है। इस फ़ंक्शन के लिए बार-बार कॉल करने से नीरस रूप से बढ़ते परिणामों की गारंटी नहीं मिलती है। बाह्य समय संदर्भों के साथ सिंक्रनाइज़ेशन या घड़ी के स्पष्ट उपयोगकर्ता परिवर्तन के कारण सिस्टम समय घट सकता है।


4

इसे इस्तेमाल करे :

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;

इस उदाहरण में, dateWithTimeIntervalSince1970 का उपयोग फॉर्मैटर @ "YYYY-MM-dd HH: mm: ss.SSS" के संयोजन में किया जाता है, जो वर्ष, महीने, दिन और समय के साथ दिनांक को घंटे, मिनट, सेकंड और मिलीसेकंड पर लौटाएगा। । उदाहरण देखें: "2015-12-02 04: 43: 15.008"। मैंने NSString का उपयोग यह सुनिश्चित करने के लिए किया कि प्रारूप पहले लिखा जाएगा।


4

यह मूल रूप से @TristanLorach द्वारा पोस्ट किया गया एक ही उत्तर है, बस स्विफ्ट 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)
   }

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

}


1

यही मैंने स्विफ्ट के लिए इस्तेमाल किया

var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)

print("Time in milliseconds is \(currentTime)")

सटीकता को सत्यापित करने के लिए इस साइट का इस्तेमाल किया http://currentmillis.com/


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

कृपया अपने कोड में कुछ स्पष्टीकरण जोड़ें जैसे कि अन्य लोग इससे सीख सकते हैं - खासकर यदि आप एक प्रश्न का उत्तर पोस्ट करते हैं जिसमें पहले से ही बहुत सारे उत्तर हैं
निको हसे

0

[NSDate timeIntervalSinceReferenceDate]एक और विकल्प है, अगर आप क्वार्ट्ज ढांचे को शामिल नहीं करना चाहते हैं। यह सेकंड का प्रतिनिधित्व करते हुए एक दोहरा रिटर्न देता है।


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];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.