Czy ktoś może mi dać pomysł, jak uzyskać aktualną datę w milisekundach?
objective-c
cocoa-touch
ios
date
time
śiwa
źródło
źródło
Odpowiedzi:
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:
źródło
CFAbsoluteTimeGetCurrent()
zwraca czas względem daty odniesieniaJan 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.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.
źródło
timeIntervalSince1970
Sposób nie wraca w sekundach na liczbie całkowitej, jednak jest todouble
, że zawiera również drugą frakcjonowaną studzienki, do której może zostać arytmetycznie przekształcany w milisekundach. Stąd mnożenie przez 1000.long long
? ten język jest taki dziwnyNSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);
źródło
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() } }
źródło
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
źródło
@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];
źródło
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.
źródło
Konwertuj
NSTimeInterval
milisecondedDate
wartość na,nsstring
a następnie zamień naint
.źródło
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?
źródło
- (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; }
źródło
Użyj tego, aby uzyskać czas w milisekundach
(long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970])
.źródło
Przedłużenie terminu jest prawdopodobnie najlepszym sposobem na to.
extension NSDate { func msFromEpoch() -> Double { return self.timeIntervalSince1970 * 1000 } }
źródło