Milisaniye cinsinden güncel tarihi alın


Yanıtlar:


103

Kişisel favorim olmasına rağmen, bunu yapmanın birkaç yolu var:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Bu yöntem hakkında daha fazla bilgi bulabilirsiniz burada . 1/1/1970 tarihinden beri geçen saniyeleri döndüren timeIntervalSince1970'i çağırarak da bir NSDate nesnesi oluşturabilir ve zaman elde edebilirsiniz :

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

Ve Swift'de:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970

4
aşağıdaki kodu deniyorum NSTimeInterval milisecondedDate = ([[NSDate tarihi] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate);
siva

2
Sorun NSLog ifadesiyle ilgilidir. NSTimeInterval, typedefed bir çifttir. Bu nedenle,% d yerine% f kullanmalısınız.
Pawel

55
[[NSDate date] timeIntervalSince1970] mili saniye değil, saniye cinsinden süre olan bir NSTimeInterval döndürür.
Erik van der Neut

12
CFAbsoluteTimeGetCurrent()Referans tarihine göre zamanı döndürdüğünü unutmayın Jan 1 2001 00:00:00 GMT. Soruda bir referans tarih belirtilmedi, ancak bunun bir UNIX zaman damgası olmadığını unutmayın.
nyi

2
[[NSDate date] timeIntervalSince1970], zamanı milisaniye cinsinden değil, saniye cinsinden döndürür.
SAPLogix

61

NSTimeInterval'i doğrudan benim için uzun bir süreye çevirmek, bunun yerine uzun bir süre yapmak zorunda kaldım.

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

Sonuç, Unix'teki gibi 13 basamaklı bir zaman damgasıdır.


4
Bu, gerçek milisaniyeleri döndürmez çünkü timeIntervalSince1970, aralığı saniye cinsinden döndürür, bu nedenle istenen milisaniye doğruluğuna sahip olmayacağız.
Danpe

9
timeIntervalSince1970 Yöntem, bununla birlikte, bir, Bütün dizi saniye geri dönüşü doublede aritmetik olarak milisaniye dönüştürülebilir oyuk fraksiyonel ikinci kapsadığı anlamına gelir. Dolayısıyla, 1000 ile çarpma.
wileymab

@wileymap Evet, haklısın. Daha sonra anladım
Danpe

2
long long? bu dil çok garip
user924

@ user924 Daha fazla katılıyorum. Bu yüzden yazmayı bıraktım. ;)
wileymab

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

aşağıdaki kodu deniyorum NSTimeInterval milisecondedDate = ([[NSDate tarihi] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate); - ancak değeri negatif değerde gösteriyor - ResponseTIME ---- 556610175 ResponseTIME ---- -1548754395
siva

1
% d yerine% f yer tutucusunu kullanmayı deneyin. Bu işe yaramazsa - çarpımı 1000 ile kaldırın
Eimantas

@ Eimantas,% f ... kullanmaya çalıştığımda Takip Yanıt Süresi olarak zaman alıyorum = 1306494959011.239014 Yanıt Süresi = 1306494910724.744141 ms ise yukarıdaki süre bir saatten fazladır.
siva

Mevcut tarih, 1970'ten bu yana saniye cinsinden zaman aralığıdır. Referans tarihinden hiçbir şey bahsetmediniz.
Eimantas

sadece geçerli tarih zaman aralığını alacağım
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()
    }
}

7

Sadece bunu yapabilirsiniz:

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

bu milisaniye cinsinden bir değer döndürecektir, bu nedenle elde edilen değeri 1000 ile çarparsanız (benim Eimantalarımda önerildiği gibi) uzun türü aşarsınız ve negatif bir değerle sonuçlanır.

Örneğin, şu anda bu kodu çalıştırırsam, sonuç

currentTime = 1357234941

ve

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

5

@JavaZava çözümünüz iyidir, ancak Java veya JavaScript'teki (ve diğer dillerdeki) zaman damgası biçimlendirmesiyle tutarlı olması için 13 basamaklı uzun bir değere sahip olmak istiyorsanız şu yöntemi kullanın:

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;

veya (bir dizeye ihtiyacınız varsa):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];

NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", digits, decimalDigits]; aslında doğrudur. Sizin durumunuzda decimalDigits değeri 100'den küçükse yanlış sonuç verecektir.
PANKAJ VERMA

4

Daha önce belirtildiği gibi, [[NSDate date] timeIntervalSince1970] mili saniye değil, saniye cinsinden süre olan bir NSTimeInterval döndürür.

İstediğiniz dile nasıl ulaşabileceğinizi görmek için https://currentmillis.com/ adresini ziyaret edebilirsiniz . İşte liste -

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

Objektif C için basmak için aşağıdaki gibi bir şey yaptım -

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

Hopw bu yardımcı olur.


1

Cconvert NSTimeInterval milisecondedDatedeğer nsstringve içine dönüştürdükten sonra 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

Zamanı milisaniye cinsinden almak için bunu kullanın (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).


0

Randevu uzatma muhtemelen bunu yapmanın en iyi yoludur.

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.