IPhone: Как получить текущие миллисекунды?

Каков наилучший способ получить текущие миллисекунды системного времени?

Ответ 1

[[NSDate date] timeIntervalSince1970];

Он возвращает количество секунд, начиная с эпохи, как двойной. Я почти уверен, что вы можете получить доступ к миллисекундам из дробной части.

Ответ 2

Если вы планируете использовать это для относительного времени (например, для игр или анимации), я бы лучше использовал CACurrentMediaTime()

double CurrentTime = CACurrentMediaTime();

Какой рекомендуемый способ; NSDate извлекает данные из сетевых синхронизирующих часов и время от времени NSDate при повторной синхронизации с сетью.

Возвращает текущее абсолютное время в секундах.


Если вы хотите только десятичную часть (часто используется при синхронизации анимации),

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

Ответ 3

Я сравнил все остальные ответы на iPhone 4S и iPad 3 (выпускные версии). CACurrentMediaTime имеет наименьшую накладную часть с небольшим отрывом. timeIntervalSince1970 намного медленнее, чем другие, возможно, из-за NSDate накладных расходов на создание, хотя это может не иметь значения для многих случаев использования.

Я бы рекомендовал CACurrentMediaTime, если вы хотите получить наименьшие издержки и не возражаете добавить зависимость от Quartz Framework. Или gettimeofday, если переносимость является для вас приоритетом.

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

Ответ 4

В Swift мы можем сделать функцию и сделать следующее:

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

var currentTime = getCurrentMillis()

Несмотря на то, что он работает отлично в Swift 3.0, но мы можем изменить и использовать класс Date вместо NSDate в 3.0

Swift 3.0

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

var currentTime = getCurrentMillis()

Ответ 5

До сих пор я нашел gettimeofday хорошее решение на iOS (iPad), когда вы хотите выполнить некоторую оценку интервала (скажем, частоту кадров, время кадра рендеринга...):

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

Ответ 6

Swift 2

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

Swift 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds

Ответ 7

Чтобы получить миллисекунды на текущую дату.

Свифт 4+:

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

Ответ 8

Может быть полезно узнать о CodeTimestamps, которые предоставляют оболочку вокруг функций синхронизации на основе mach. Это дает вам временные данные с разрешением наносекундного разрешения - 1000000x точнее, чем миллисекунды. Да, в миллион раз точнее. (Префикс - милли, микро, нано, каждый 1000 раз более точный, чем последний.) Даже если вам не нужны CodeTimestamps, проверьте код (его открытый исходный код), чтобы узнать, как они используют mach для получения данных синхронизации. Это было бы полезно, если вам нужна более высокая точность и требуется быстрый вызов метода, чем подход NSDate.

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

Ответ 9

// Timestamp after converting to milliseconds.

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

Ответ 10

Мне нужен объект 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]

Ответ 11

Попробуйте следующее:

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, чтобы убедиться, что формат будет написан ранее.

Ответ 12

CFAbsoluteTimeGetCurrent()

Абсолютное время измеряется в секундах относительно абсолютной контрольной даты 1 января 2001 года 00:00:00 GMT. Положительное значение представляет собой дату после контрольной даты, отрицательное значение представляет собой дату перед ней. Например, абсолютное время -32940326 эквивалентно 16 декабря 1999 года в 17:54:34. Повторные вызовы этой функции не гарантируют монотонно возрастающих результатов. Системное время может уменьшаться из-за синхронизации с внешними ссылками времени или из-за явного изменения пользователем часов.

Ответ 13

Это в основном тот же ответ, что и @TristanLorach, просто перекодированный для 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)
   }

Ответ 14

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

}

Ответ 15

Это то, что я использовал для Swift

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

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

использовал этот сайт для проверки точности http://currentmillis.com/

Ответ 16

[NSDate timeIntervalSinceReferenceDate] - это еще один вариант, если вы не хотите включать в себя кварцевую структуру. Он возвращает двойной, представляющий секунды.

Ответ 17

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];

Ответ 18

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

Ответ 19

Используя этот метод:

[[NSDate date] timeIntervalSince1970]*1000;

Это похоже на System.currentTimeMillis() в Java;