Nhận ngày hiện tại tính bằng mili giây


94

Bất kỳ ai có thể cho tôi một ý tưởng làm thế nào để có được ngày hiện tại trong mili giây?



Khi bạn nói ngày hiện tại tính bằng mili giây, ý bạn là gì? Bạn có thể cung cấp một ví dụ về sản lượng dự kiến ​​của bạn cho một ngày cụ thể không?
lnafziger

Câu trả lời:


103

Có một số cách để làm điều này, mặc dù yêu thích của cá nhân tôi là:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Bạn có thể đọc thêm về phương pháp này tại đây . Bạn cũng có thể tạo một đối tượng NSDate và lấy thời gian bằng cách gọi timeIntervalSince1970 trả về giây kể từ ngày 1/1/1970:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

Và trong Swift:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970

4
tôi đang thử theo mã NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate);
siva

2
Vấn đề là với câu lệnh NSLog. NSTimeInterval là một định dạng kép. Vì vậy, bạn nên sử dụng% f thay vì% d.
Pawel

55
[[NSDate date] timeIntervalSince1970] trả về NSTimeInterval, là khoảng thời gian tính bằng giây, không phải mili giây.
Erik van der Neut

12
Lưu ý rằng CFAbsoluteTimeGetCurrent()trả về thời gian liên quan đến ngày tham chiếu Jan 1 2001 00:00:00 GMT. Không phải ngày tham chiếu được đưa ra trong câu hỏi, nhưng hãy lưu ý rằng đây không phải là dấu thời gian UNIX.
nyi

2
[[NSDate date] timeIntervalSince1970] trả về thời gian tính bằng giây chứ không phải mili giây.
SAPLogix

61

Truyền trực tiếp NSTimeInterval đến một khoảng thời gian dài bị tràn đối với tôi, vì vậy thay vào đó tôi phải truyền đến một khoảng thời gian dài.

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

Kết quả là một dấu thời gian 13 chữ số như trong Unix.


4
Điều này sẽ không trả về mili giây thực tế vì timeIntervalSince1970 trả về khoảng thời gian tính bằng giây, vì vậy chúng tôi sẽ không có độ chính xác mili mong muốn.
Danpe

9
Các timeIntervalSince1970 phương pháp thực hiện trở lại tại giây trên toàn bộ số, tuy nhiên nó là một doublemà cũng bao gồm các phân đoạn thứ hai cũng có thể được chuyển đổi sang số học mili giây. Do đó, các nhân bằng 1000.
wileymab

@wileymap Yup, bạn nói đúng. Tôi đã tìm ra nó sau này
Danpe

2
long long? ngôn ngữ này thật kỳ lạ
user924

@ user924 Không thể đồng ý thêm. Đó là lý do tại sao tôi ngừng viết nó. ;)
wileymab

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

tôi đang thử theo mã NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate); - nhưng nó hiển thị giá trị bằng val âm - như ResponseTIME ---- 556610175 ResponseTIME ---- -1548754395
siva

1
hãy thử sử dụng trình giữ chỗ% f thay vì% d. Nếu điều đó không hiệu quả - hãy xóa phép nhân với 1000
Eimantas

@ Eimantas, Khi tôi cố gắng sử dụng% f ... Tôi nhận được thời gian là Thời gian phản hồi theo dõi = 1306494959011.239014 Thời gian phản hồi = 1306494910724.744141 Nếu là ms thì thời gian trên là hơn một giờ.
siva

Ngày hiện tại là khoảng thời gian tính bằng giây kể từ năm 1970. Bạn đã không đề cập đến ngày tham chiếu.
Eimantas

tôi sẽ chỉ lấy khoảng thời gian ngày hiện tại
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

Bạn chỉ có thể làm điều này:

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

điều này sẽ trả về một giá trị trong mili giây, vì vậy nếu bạn nhân giá trị kết quả với 1000 (như Eimantas của tôi đề xuất), bạn sẽ làm tràn kiểu long và nó sẽ dẫn đến giá trị âm.

Ví dụ: nếu tôi chạy mã đó ngay bây giờ, nó sẽ dẫn đến

currentTime = 1357234941

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

5

@JavaZava giải pháp của bạn là tốt, nhưng nếu bạn muốn có giá trị dài 13 chữ số để phù hợp với định dạng dấu thời gian trong Java hoặc JavaScript (và các ngôn ngữ khác), hãy sử dụng phương pháp này:

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;

hoặc (nếu bạn cần một chuỗi):

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

NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", các chữ số, decimalDigits]; thực sự là đúng. Trong trường hợp của bạn nếu giá trị decimalDigits nhỏ hơn 100 sẽ tạo ra kết quả sai.
PANKAJ VERMA

4

Như đã đề cập trước đây, [[NSDate date] timeIntervalSince1970] trả về NSTimeInterval, là khoảng thời gian tính bằng giây, không phải mili giây.

Bạn có thể truy cập https://currentmillis.com/ để xem cách bạn có thể sử dụng ngôn ngữ mà bạn mong muốn. Đây là danh sách -

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

Đối với mục tiêu CI đã làm một cái gì đó như dưới đây để in nó -

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

Hy vọng điều này sẽ giúp.


1

Chuyển đổi NSTimeInterval milisecondedDategiá trị thành nsstringvà sau đó chuyển đổi thành 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

Sử dụng tùy chọn này để tính thời gian tính bằng mili giây (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).


0

Gia hạn đúng ngày có lẽ là cách tốt nhất để giải quyết vấn đề này.

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.