Получить текущую дату в миллисекундах - PullRequest
86 голосов
/ 27 мая 2011

Может кто-нибудь подсказать, как получить текущую дату в миллисекундах?

Ответы [ 12 ]

98 голосов
/ 27 мая 2011

Есть несколько способов сделать это, хотя мой личный фаворит:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Подробнее об этом методе можно прочитать здесь . Вы также можете создать объект NSDate и получить время, вызвав timeIntervalSince1970 , который возвращает секунд с 01.01.1970:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

А в Свифте:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970
59 голосов
/ 03 апреля 2013

Приведение NSTimeInterval напрямую к длинному переполнено для меня, поэтому вместо этого мне пришлось приводить к длинному длинному.

long long milliseconds = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);

В результате получается 13-значная временная метка, как в Unix.

10 голосов
/ 27 мая 2011
NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);
7 голосов
/ 14 октября 2015
extension NSDate {

    func toMillis() -> NSNumber {
        return NSNumber(longLong:Int64(timeIntervalSince1970 * 1000))
    }

    static func fromMillis(millis: NSNumber?) -> NSDate? {
        return millis.map() { number in NSDate(timeIntervalSince1970: Double(number) / 1000)}
    }

    static func currentTimeInMillis() -> NSNumber {
        return NSDate().toMillis()
    }
}
7 голосов
/ 03 января 2013

Вы можете просто сделать это:

long currentTime = (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]);

это вернет значение в миллисекундах, поэтому, если вы умножите полученное значение на 1000 (как предложили мои Eimantas), вы переполните тип long и приведете к отрицательному значению.

Например, если я выполню этот код прямо сейчас, это приведет к

currentTime = 1357234941

и

currentTime /seconds / minutes / hours / days = years
1357234941 / 60 / 60 / 24 / 365 = 43.037637652207
5 голосов
/ 28 февраля 2013

@ JavaZava ваше решение хорошо, но если вы хотите, чтобы значение длиной 13 цифр соответствовало форматированию меток времени в Java или JavaScript (и других языках), используйте этот метод:

NSTimeInterval time = ([[NSDate date] timeIntervalSince1970]); // returned as a double
long digits = (long)time; // this is the first 10 digits
int decimalDigits = (int)(fmod(time, 1) * 1000); // this will get the 3 missing digits
long timestamp = (digits * 1000) + decimalDigits;

или (если вам нужна строка):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];
2 голосов
/ 16 мая 2018

Как упоминалось ранее, [[NSDate date] timeIntervalSince1970] возвращает NSTimeInterval, который представляет собой длительность в секундах, а не в миллисекундах.

Вы можете посетить https://currentmillis.com/, чтобы увидеть, как вы можете получить на желаемом языке. Вот список -

ActionScript    (new Date()).time
C++ std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
C#.NET  DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Clojure (System/currentTimeMillis)
Excel / Google Sheets*  = (NOW() - CELL_WITH_TIMEZONE_OFFSET_IN_HOURS/24 - DATE(1970,1,1)) * 86400000
Go / Golang time.Now().UnixNano() / 1000000
Hive*   unix_timestamp() * 1000
Java / Groovy / Kotlin  System.currentTimeMillis()
Javascript  new Date().getTime()
MySQL*  UNIX_TIMESTAMP() * 1000
Objective-C (long long)([[NSDate date] timeIntervalSince1970] * 1000.0)
OCaml   (1000.0 *. Unix.gettimeofday ())
Oracle PL/SQL*  SELECT (SYSDATE - TO_DATE('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) * 24 * 60 * 60 * 1000 FROM DUAL
Perl    use Time::HiRes qw(gettimeofday); print gettimeofday;
PHP round(microtime(true) * 1000)
PostgreSQL  extract(epoch FROM now()) * 1000
Python  int(round(time.time() * 1000))
Qt  QDateTime::currentMSecsSinceEpoch()
R*  as.numeric(Sys.time()) * 1000
Ruby    (Time.now.to_f * 1000).floor
Scala   val timestamp: Long = System.currentTimeMillis
SQL Server  DATEDIFF(ms, '1970-01-01 00:00:00', GETUTCDATE())
SQLite* STRFTIME('%s', 'now') * 1000
Swift*  let currentTime = NSDate().timeIntervalSince1970 * 1000
VBScript / ASP  offsetInMillis = 60000 * GetTimeZoneOffset()
WScript.Echo DateDiff("s", "01/01/1970 00:00:00", Now()) * 1000 - offsetInMillis + Timer * 1000 mod 1000

Для цели C я сделал что-то вроде ниже, чтобы напечатать это -

long long mills = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);
 NSLog(@"Current date %lld", mills);

Но это помогает.

1 голос
/ 22 октября 2012

Преобразовать NSTimeInterval milisecondedDate значение в nsstring и после этого преобразовать в int.

0 голосов
/ 04 марта 2015

Продление на дату, вероятно, лучший способ об этом.

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
0 голосов
/ 03 сентября 2014

Используйте это, чтобы получить время в миллисекундах (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...