আইফোন: কীভাবে বর্তমান মিলি সেকেন্ড পাবেন?


225

বর্তমান সিস্টেম টাইম মিলিসেকেন্ডগুলি পাওয়ার সবচেয়ে ভাল উপায় কী?

উত্তর:


273
[[NSDate date] timeIntervalSince1970];

এটি যুগের দ্বিতীয়ার হিসাবে সেকেন্ডের সংখ্যাটি দেয় returns আমি প্রায় নিশ্চিত আপনি ভগ্নাংশের অংশ থেকে মিলি সেকেন্ড অ্যাক্সেস করতে পারবেন।


29
এটি এটিকে লেখার জন্য কাউকে হত্যা করে না: এনএসটিমেআইন্টারওয়াল মাইন্টারভাল = এনএসডিট.টাইম ইন্টারভালসিন্স ১৯70০; // আপনি যদি আমাকে জিজ্ঞাসা করেন তবে এই সমস্ত বন্ধনীগুলি সত্যই পুরানো fashion
পিজ্জাইওলা গর্জনজোলা

11
'সেই বন্ধনীগুলি' স্ট্যাকওভারফ্লো.com
ম্যাথু

119
"সেই বন্ধনীগুলি" উদ্দেশ্য-গ। আপনি যদি আইওএসের জন্য বিকাশ করতে চান তবে আপনার সম্ভবত তাদের সাথে স্বাচ্ছন্দ্য বোধ করা উচিত।
এম্পারস 4 ই

5
আমি এই পদ্ধতিটি কিছুক্ষণ ব্যবহার করছি এবং বুঝতে পেরেছিলাম যে আপনি কয়েক মিলিসেকেন্ড পরে কল করার পরে এটি পূর্বের মানটি ফিরে আসতে পারে (উদাহরণস্বরূপ এটিকে কল করুন এবং আপনি সম্ভবত ক্রমবর্ধমান ক্রম দিয়ে শেষ করবেন না)
এজ আক্পিনার

5
[NSDate timeIntervalSinceReferenceDate]সস্তা. (যদিও এটি একটি ভিন্ন "যুগের" রেফারেন্স দেয় - আপনি যদি 1970 দেখতে চান তবে ধ্রুবক যোগ করুন NSTimeIntervalSince1970))
হট লিক্স

311

আপনি যদি আপেক্ষিক সময়ের জন্য এটি ব্যবহারের দিকে তাকিয়ে থাকেন (উদাহরণস্বরূপ গেমস বা অ্যানিমেশনের জন্য) আমি বরং CACurrentMediaTime () ব্যবহার করব

double CurrentTime = CACurrentMediaTime();

যা প্রস্তাবিত উপায়; NSDateনেটওয়ার্কযুক্ত সিঙ্ক-ক্লক থেকে আঁকুন এবং এটি নেটওয়ার্কের সাথে পুনরায় সিঙ্ক করার সময় মাঝে মধ্যে হিচাপ হবে।

এটি বর্তমান পরম সময়টি সেকেন্ডে ফেরত দেয়।


আপনি যদি কেবল দশমিক অংশ চান (অ্যানিমেশনগুলিকে সিঙ্ক করার সময় প্রায়শই ব্যবহৃত হয়),

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

7
তবে মনে হচ্ছে [[এনএসডি তারিখের সময়] সময়সত্তা-সত্ত্বা1970] এর জন্য দ্বিগুণ সময় লাগবে। 15000 কলগুলিতে আমি 0.065ms বনাম 0.033ms পরিমাপ করেছি।
কে

1
দ্রষ্টব্য, এই কলটি করার জন্য আপনার কোয়ার্টজ ফ্রেমওয়ার্ক এবং # ইম্পোর্ট <কোয়ার্টজ / সিএবিজেএল> অন্তর্ভুক্ত করতে হবে।
BadPirate

8
ওহো - এই আমদানিগুলি # আমদানি <কোয়ার্টজকোর / CAAnimation.h> আমদানি করে
ব্যাডপ্রেট

6
এক্সকোডে নতুন হিসাবে (আমার মতো) "কোয়ার্টজ ফ্রেমওয়ার্ক অন্তর্ভুক্ত করুন" এর অর্থ এটি "লাইব্রেরিগুলির সাথে লিংক বাইনারি সাথে" লাইব্রেরিগুলির সেটগুলিতে যুক্ত করা।
গাবে জনসন

3
স্প্রিটকিট সম্পর্কিত যে কেউ যদি এটি সন্ধান করে থাকে, এসকেসিনের আপডেট পদ্ধতিতে 'বর্তমান সময়' হ'ল প্রকৃতপক্ষে সিএকোরেন্টমিডিয়াটাইম ();
অ্যান্টনি ম্যাটক্স

92

আমি অন্যান্য সমস্ত উত্তর একটি আইফোন 4 এস এবং আইপ্যাড 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ম্যাক্রো যা দ্রুততম হয়।
ওজগুর

@ ওজগুর NSTimeIntervalSince1970হ'ল 1970-01-01 এবং "রেফারেন্সের তারিখ" (যেমন 2001-01-01) এর মধ্যে সেকেন্ডের বর্ণনা দেয়, তাই এটি সর্বদা 978307200 এর সমান হয়
এমজেকে

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

এখন পর্যন্ত আমি gettimeofdayআইওএস (আইপ্যাড) এ একটি ভাল সমাধান পেয়েছি , যখন আপনি কিছু বিরতি মূল্যায়ন করতে চান (বলুন, ফ্রেমরেট করুন, একটি রেন্ডারিং ফ্রেমের সময় নির্ধারণ করুন ...):

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

2
আমি এটি খুব পছন্দ করি কারণ এটি খুব বহনযোগ্য। নোট করুন যে ওএসের উপর নির্ভর করে আপনার অন্যান্য গণনা করার আগে 'লম্বা' এর পরিবর্তে 'দীর্ঘ দীর্ঘ' ব্যবহার করতে হবে এবং একইভাবে সময় t
এবেপ্যারেন্স

স্ট্যাটিক স্বাক্ষরযুক্ত লম্বা getMStime (বাতিল); কাঠামোর সময়সীমা; গেটটাইম ডে (& সময়, NULL); রিটার্ন (সময়.tv_sec * 1000) + (সময়.tv_usec / 1000); }
ডেভিড এইচ

মজার বিষয় হল এটি আমার আইফোন 5 এস এবং ম্যাকের জন্য দুর্দান্ত কাজ করে তবে একটি আইপ্যাড 3-তে একটি ভুল মান দেয়
হিনড্রিক্স

নেতিবাচক সংখ্যাগুলি এড়াতে আমাকে গণিতের আগে কাস্ট করতে হয়েছিল: int64_t ফলাফল = ((int64_t) tv.tv_sec * 1000) + ((int64_t) tv.tv_usec / 1000);
জেসন গিলবার্ট

এটি সময়-পূর্ববর্তী সময়ে ফিরে আসে
শৌকেত শেখ

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
লিও ডাবাস

10

কোডটাইমস্ট্যাম্পস সম্পর্কে জানার জন্য এটি দরকারী হতে পারে, যা মাচ-ভিত্তিক সময় কার্যকারিতার চারপাশে একটি মোড়ক সরবরাহ করে। এটি আপনাকে ন্যানোসেকেন্ড-রেজোলিউশনের সময়কালীন ডেটা দেয় - মিলি সেকেন্ডের চেয়ে 1000000x বেশি সুনির্দিষ্ট। হ্যাঁ, আরও কয়েক মিলিয়ন গুণ (উপসর্গগুলি মিলি, মাইক্রো, ন্যানো, প্রতিটি 1000x শেষের তুলনায় আরও নির্ভুল ise আপনার যখন আরও নির্ভুলতার প্রয়োজন হবে এবং এনএসডিট পদ্ধতির চেয়ে দ্রুত পদ্ধতির কল চাইবেন তখন এটি কার্যকর হবে।

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


আর আপনি -fno-objc-arcযদি
আরসি


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;

এই উদাহরণে, তারিখবিথটাইমআইন্টারওয়ালসিনস ১৯৯০ ফর্ম্যাটর @ "YYYY-MM-dd HH: mm: ss.SSS" এর সংমিশ্রণে ব্যবহৃত হয় যা বছর, মাস, দিন এবং সময়, ঘন্টা, মিনিট, সেকেন্ড এবং মিলিসেকেন্ডের সাথে সময় ফিরিয়ে দেবে । উদাহরণটি দেখুন: "2015-12-02 04: 43: 15.008"। আমি এনএসএসস্ট্রিংটি নিশ্চিত করেছিলাম যে ফর্ম্যাটটি আগে লেখা হবে।


4

এটি মূলত একই উত্তর যা @ ত্রিস্তানলোরাক পোস্ট করেছেন, কেবল সুইফট 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://c موجودہmillis.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];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.