Отримати поточну дату в мілісекундах


94

Хтось може дати мені уявлення, як отримати поточну дату в мілісекундах?



Коли ви говорите поточну дату в мілісекундах, що ви маєте на увазі? Чи можете ви навести приклад очікуваного результату на конкретну дату?
lnafziger

Відповіді:


103

Є кілька способів зробити це, хоча моїм улюбленим є:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Детальніше про цей метод ви можете прочитати тут . Ви також можете створити об'єкт NSDate і отримати час, викликавши timeIntervalSince1970, який повертає секунди з 01.01.1970:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

А в Свіфті:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970

4
я намагаюся виконати наступний код NSTimeInterval milisecondedDate = ([[[дата NSDate] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate);
siva

2
Проблема в операторі NSLog. NSTimeInterval - це типовий подвійний. Таким чином, ви повинні використовувати% f замість% d.
Павел,

55
[[Дата NSDate] timeIntervalSince1970] повертає NSTimeInterval, який є тривалістю в секундах, а не в мілісекундах.
Ерік ван дер Нойт

12
Зверніть увагу, що CFAbsoluteTimeGetCurrent()повертає час відносно контрольної дати Jan 1 2001 00:00:00 GMT. Не те, щоб у питанні була вказана контрольна дата, але майте на увазі, що це не мітка часу UNIX.
nyi

2
[[Дата NSDate] timeIntervalSince1970] повертає час у секундах, а не в мілісекундах.
SAPLogix

61

Передача NSTimeInterval безпосередньо на довгий переповнений для мене, тому натомість мені довелося кидати на довгий довгий.

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

Результат - 13-значна мітка часу, як у Unix.


4
Це не повертає фактичні мілісекунди, оскільки timeIntervalSince1970 повертає інтервал у секундах, тому ми не матимемо бажаної точності в мілісекундах.
Данпе

9
timeIntervalSince1970 Метод робить повернення в секундах на ціле число, однак це , doubleщо також включає в себе другу фракційну , а також які можуть бути арифметично перетворені в мілісекундах. Отже, множення на 1000.
wileymab

@wileymap Так, ти маєш рацію. Я зрозумів це пізніше
Данпе

2
long long? ця мова така дивна
user924

@ user924 Не можу більше погодитись. Тому я перестав його писати. ;)
wileymab

10
NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);

я намагаюся виконати наступний код NSTimeInterval milisecondedDate = ([[[дата NSDate] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate); - але він показує значення в негативному Вале - як ResponseTime ---- 556610175 ResponseTime ---- -1548754395
Шив

1
спробуйте використовувати% f заповнювач замість% d. Якщо це не допомогло - приберіть множення на 1000
Еймантас

@ Eimantas, Коли я намагаюся використовувати% f ... Я отримую час, як слід Час відповіді = 1306494959011.239014 Час відповіді = 1306494910724.744141 Якщо це ms, то вказаний час становить більше години.
сива

Поточна дата - це часовий інтервал у секундах з 1970 року. Ви нічого не згадували про контрольну дату.
Еймантас,

я візьму лише поточний часовий інтервал дати
сива

8
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

Ви можете просто зробити це:

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

це поверне значення в мілісекундах, тому, якщо помножити отримане значення на 1000 (як пропонується моїм Eimantas), ви переповните довгий тип, і це призведе до негативного значення.

Наприклад, якщо я запустив цей код прямо зараз, це призведе до

currentTime = 1357234941

і

currentTime /seconds / minutes / hours / days = years
1357234941 / 60 / 60 / 24 / 365 = 43.037637652207

5

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

NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", цифри, десяткові цифри]; є правильним насправді. У вашому випадку, якщо значення decimalDigits менше 100, це дасть неправильний результат.
ПАНКАЙ ВЕРМА

4

Як згадувалося раніше, [[дата NSDate] 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

Для об’єктивного ДІ зробив щось подібне нижче, щоб надрукувати його -

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

Хоп, це допомагає.


1

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



0
- (void)GetCurrentTimeStamp
    {
        NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
        [objDateformat setDateFormat:@"yyyy-MM-dd"];
        NSString    *strTime = [objDateformat stringFromDate:[NSDate date]];
        NSString    *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
        NSDate *objUTCDate  = [objDateformat dateFromString:strUTCTime];
        long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);

        NSString *strTimeStamp = [NSString stringWithFormat:@"%lld",milliseconds];
        NSLog(@"The Timestamp is = %@",strTimeStamp);
    }

 - (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSDate  *objDate    = [dateFormatter dateFromString:IN_strLocalTime];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *strDateTime   = [dateFormatter stringFromDate:objDate];
        return strDateTime;
    }

0

Використовуйте це, щоб отримати час у мілісекундах (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).


0

Подовження дати - це, мабуть, найкращий спосіб це зробити.

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.