Dapatkan tanggal sekarang dalam milidetik

Jawaban:

103

Ada beberapa cara untuk melakukan ini, meskipun favorit pribadi saya adalah:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Anda dapat membaca lebih lanjut tentang metode ini di sini . Anda juga dapat membuat objek NSDate dan mendapatkan waktu dengan memanggil timeIntervalSince1970 yang mengembalikan detik sejak 1/1/1970:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

Dan di Swift:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970
Pawel
sumber
4
Saya mencoba ini kode berikut NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate);
siva
2
Masalahnya ada pada pernyataan NSLog. NSTimeInterval adalah double typedefed. Jadi, Anda harus menggunakan% f, bukan% d.
Pawel
55
[[NSDate date] timeIntervalSince1970] mengembalikan NSTimeInterval, yang merupakan durasi dalam detik, bukan mili-detik.
Erik van der Neut
12
Perhatikan bahwa CFAbsoluteTimeGetCurrent()mengembalikan waktu relatif terhadap tanggal referensi Jan 1 2001 00:00:00 GMT. Bukan karena tanggal referensi diberikan dalam pertanyaan, tetapi perlu diketahui bahwa ini bukan stempel waktu UNIX.
nyi
2
[[NSDate date] timeIntervalSince1970] mengembalikan waktu dalam detik dan bukan dalam milidetik.
SAPLogix
61

Casting NSTimeInterval langsung ke long overflow untuk saya, jadi saya harus melakukan cast ke long.

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

Hasilnya adalah stempel waktu 13 digit seperti di Unix.

wileymab.dll
sumber
4
Ini tidak akan mengembalikan milidetik sebenarnya karena timeIntervalSince1970 mengembalikan interval dalam detik, jadi kita tidak akan memiliki akurasi milidetik yang diinginkan.
Danpe
9
The timeIntervalSince1970 Metode tidak kembali pada detik pada jumlah keseluruhan, namun itu adalah doubleyang juga mencakup kedua pecahan juga yang dapat deret hitung dikonversi ke milidetik. Oleh karena itu, perkalian dengan 1000.
wileymab
@wileymap Yup, kamu benar. Saya mengetahuinya nanti
Danpe
2
long long? bahasa ini sangat aneh
user924
@ user924 Sangat setuju. Itu sebabnya saya berhenti menulisnya. ;)
wileymab
10
NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);
Eimantas
sumber
Saya mencoba ini kode berikut NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate); - tetapi itu menunjukkan nilai dalam val negatif - seperti ResponseTIME ---- 556610175 ResponseTIME ---- -1548754395
siva
1
coba gunakan placeholder% f, bukan% d. Jika itu tidak membantu - hapus perkalian dengan 1000
Eimantas
@ Eimantas, Ketika saya mencoba menggunakan% f ... Saya mendapatkan waktu sebagai Berikut Waktu Respons = 1306494959011.239014 Waktu Respons = 1306494910724.744141 Jika ms maka waktu di atas lebih dari satu jam.
siva
Tanggal sekarang adalah interval waktu dalam detik sejak tahun 1970. Anda tidak menyebutkan apapun tentang tanggal referensi.
Eimantas
Saya hanya akan mengambil interval waktu tanggal saat ini
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
sumber
7

Anda bisa melakukan ini:

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

ini akan mengembalikan nilai en milidetik, jadi jika Anda mengalikan nilai yang dihasilkan dengan 1000 (seperti yang disarankan Eimantas saya) Anda akan melimpah tipe panjang dan itu akan menghasilkan nilai negatif.

Misalnya, jika saya menjalankan kode itu sekarang, itu akan menghasilkan

currentTime = 1357234941

dan

currentTime /seconds / minutes / hours / days = years
1357234941 / 60 / 60 / 24 / 365 = 43.037637652207
JavaZava.dll
sumber
5

@JavaZava solusi Anda bagus, tetapi jika Anda ingin memiliki nilai panjang 13 digit agar konsisten dengan pemformatan cap waktu di Java atau JavaScript (dan bahasa lain) gunakan metode ini:

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;

atau (jika Anda membutuhkan string):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];
Itai Hanski
sumber
NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", digit, decimalDigits]; benar sebenarnya. Dalam kasus Anda, jika nilai decimalDigits kurang dari 100 akan menghasilkan hasil yang salah.
PANKAJ VERMA
4

Seperti yang disebutkan sebelumnya, [[NSDate date] timeIntervalSince1970] mengembalikan NSTimeInterval, yang merupakan durasi dalam detik, bukan mili-detik.

Anda dapat mengunjungi https://currentmillis.com/ untuk melihat bagaimana Anda bisa mendapatkan bahasa yang Anda inginkan. Berikut daftarnya -

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

Untuk CI objektif melakukan sesuatu seperti di bawah ini untuk mencetaknya -

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

Semoga ini bisa membantu.

Aniket Thakur
sumber
1

NSTimeInterval milisecondedDateNilai Cconvert ke nsstringdan setelah itu ubah menjadi int.

vikash
sumber
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
sumber
0

Gunakan ini untuk mengetahui waktu dalam milidetik (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).

Tanvi Jain
sumber
0

Perpanjangan tanggal mungkin adalah cara terbaik untuk melakukannya.

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
joslinm
sumber