Uzyskaj aktualną datę w milisekundach

Odpowiedzi:

103

Jest na to kilka sposobów, chociaż moim ulubionym jest:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Możesz przeczytać więcej o tej metodzie tutaj . Możesz także utworzyć obiekt NSDate i uzyskać czas, wywołując timeIntervalSince1970, który zwraca liczbę sekund od 1 stycznia 1970 :

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

A w Swift:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970
Paweł
źródło
4
Próbuję tis następującego kodu NSTimeInterval milisecondedDate = ([[NSDate data] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate);
siva
2
Problem dotyczy instrukcji NSLog. NSTimeInterval jest typem double. Dlatego powinieneś używać% f zamiast% d.
Paweł
55
[[NSDate date] timeIntervalSince1970] zwraca NSTimeInterval, czyli czas trwania w sekundach, a nie w milisekundach.
Erik van der Neut
12
Zauważ, że CFAbsoluteTimeGetCurrent()zwraca czas względem daty odniesienia Jan 1 2001 00:00:00 GMT. Nie chodzi o to, że w pytaniu podano datę odniesienia, ale należy pamiętać, że nie jest to sygnatura czasowa systemu UNIX.
nyi
2
[[NSDate date] timeIntervalSince1970] zwraca czas w sekundach, a nie w milisekundach.
SAPLogix
61

Rzutowanie NSTimeInterval bezpośrednio na długi był dla mnie przepełniony, więc zamiast tego musiałem rzucić na długi długi.

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

Wynikiem jest 13-cyfrowy znacznik czasu jak w systemie Unix.

wileymab
źródło
4
To nie zwróci rzeczywistych milisekund, ponieważ timeIntervalSince1970 zwraca interwał w sekundach, więc nie będziemy mieć żądanej dokładności milisekund.
Danpe
9
timeIntervalSince1970 Sposób nie wraca w sekundach na liczbie całkowitej, jednak jest to double, że zawiera również drugą frakcjonowaną studzienki, do której może zostać arytmetycznie przekształcany w milisekundach. Stąd mnożenie przez 1000.
wileymab
@wileymap Tak, masz rację. Zrozumiałem to później
Danpe
2
long long? ten język jest taki dziwny
user924
@ user924 Nie mogę wyrazić zgody. Dlatego przestałem to pisać. ;)
wileymab
10
NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);
Eimantas
źródło
Próbuję tis następującego kodu NSTimeInterval milisecondedDate = ([[NSDate data] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate); - ale pokazuje wartość w wartości ujemnej - jak ResponseTIME ---- 556610175 ResponseTIME ---- -1548754395
siva
1
spróbuj użyć symbolu zastępczego% f zamiast% d. Jeśli to nie pomoże - usuń mnożenie przez 1000
Eimantas
@ Eimantas, Kiedy próbuję użyć% f ... Otrzymuję czas w następujący sposób Czas odpowiedzi = 1306494959011.239014 Czas odpowiedzi = 1306494910724.744141 Jeśli jest ms, powyższy czas jest dłuższy niż godzina.
siva
Bieżąca data to przedział czasu w sekundach od 1970 roku. Nie wspomniałeś o dacie odniesienia.
Eimantas
wezmę tylko aktualny przedział czasu
siva
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()
    }
}
Siamaster
źródło
7

Możesz po prostu to zrobić:

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

zwróci to wartość w milisekundach, więc jeśli pomnożymy wynikową wartość przez 1000 (jak zasugerowałem moje Eimantas), przepełnisz długi typ i da to wartość ujemną.

Na przykład, jeśli uruchomię teraz ten kod, spowoduje to

currentTime = 1357234941

i

currentTime /seconds / minutes / hours / days = years
1357234941 / 60 / 60 / 24 / 365 = 43.037637652207
JavaZava
źródło
5

@JavaZava Twoje rozwiązanie jest dobre, ale jeśli chcesz mieć 13-cyfrową wartość, aby była spójna z formatowaniem znacznika czasu w Javie lub JavaScript (i innych językach), użyj tej metody:

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;

lub (jeśli potrzebujesz ciągu):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];
Itai Hanski
źródło
NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", digits, decimalDigits]; jest w rzeczywistości poprawna. W twoim przypadku, jeśli wartość decimalDigits jest mniejsza niż 100, da zły wynik.
PANKAJ VERMA
4

Jak wspomniano wcześniej, [[NSDate date] timeIntervalSince1970] zwraca NSTimeInterval, czyli czas trwania w sekundach, a nie w milisekundach.

Możesz odwiedzić https://currentmillis.com/, aby zobaczyć, jak uzyskać dostęp do pożądanego języka. Oto lista -

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

Dla obiektywnego CI zrobiłem coś takiego jak poniżej, aby to wydrukować -

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

Hopw, to pomaga.

Aniket Thakur
źródło
1

Konwertuj NSTimeInterval milisecondedDatewartość na, nsstringa następnie zamień na int.

Vikash
źródło
0

Aby uzyskać bieżącą datę w milisekundach, możesz użyć następujących metod.

[[NSDate date] timeIntervalSince1970];

LUB

double CurrentTime = CACurrentMediaTime(); 

Źródło: iPhone: Jak uzyskać aktualne milisekundy?

Muhammad Nabeel Arif
źródło
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;
    }
Vicky
źródło
0

Użyj tego, aby uzyskać czas w milisekundach (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).

Tanvi Jain
źródło
0

Przedłużenie terminu jest prawdopodobnie najlepszym sposobem na to.

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
joslinm
źródło