iPhone: Làm thế nào để có được mili giây hiện tại?


Câu trả lời:


273
[[NSDate date] timeIntervalSince1970];

Nó trả về số giây kể từ epoch là gấp đôi. Tôi gần như chắc chắn rằng bạn có thể truy cập mili giây từ phần phân đoạn.


29
nó không giết bất cứ ai để viết nó như thế này: NSTimeInterval myInterval = NSDate.timeIntervalSince1970; // tất cả các dấu ngoặc đó thực sự lỗi thời nếu bạn hỏi tôi.
Pizzaiola Gorgonzola

11
'những dấu ngoặc đó' là phiên bản mới hơn của cú pháp theo stackoverflow.com/q/11474284/209828
Matthew

119
"Những dấu ngoặc" là mục tiêu - c. Nếu bạn muốn phát triển cho iOS, có lẽ bạn nên thoải mái với chúng.
Ampers4

5
Tôi đã sử dụng phương pháp này được một thời gian và nhận ra rằng nó có thể trả về giá trị sớm hơn khi bạn gọi nó sau vài giây (ví dụ: gọi nó liên tiếp và bạn có thể không kết thúc với một chuỗi tăng)
Ege Akpinar

5
[NSDate timeIntervalSinceReferenceDate]rẻ hơn (Mặc dù nó tham chiếu một "kỷ nguyên" khác - nếu bạn muốn 1970 thêm hằng số NSTimeIntervalSince1970.)
Hot Licks

311

Nếu bạn đang xem xét sử dụng điều này cho thời gian tương đối (ví dụ như cho trò chơi hoặc hoạt hình), tôi muốn sử dụng CACienMediaTime ()

double CurrentTime = CACurrentMediaTime();

Đó là cách được đề nghị; NSDaterút ra từ đồng hồ được kết nối mạng và đôi khi sẽ bị trục trặc khi đồng bộ lại với mạng.

Nó trả về thời gian tuyệt đối hiện tại, tính bằng giây.


Nếu bạn chỉ muốn phần thập phân (thường được sử dụng khi đồng bộ hóa hình động),

let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)

7
Nhưng dường như phải mất gấp đôi thời gian cần thiết cho [[ngày NSDate] timeIntervalSince1970]. Tôi đo được 0,065ms so với 0,033ms trên 15000 cuộc gọi.
Kay

1
Lưu ý, bạn sẽ cần bao gồm Khung Quartz và #import <Quartz / CABase.h> để thực hiện cuộc gọi này.
BadPirate

8
Rất tiếc - đó là nhập #import <QuartzCore / CAAnimation.h>
BadPirate

6
Đối với những người mới sử dụng Xcode (như tôi), "bao gồm Quartz Framework" có nghĩa là thêm nó vào bộ thư viện trong "Liên kết nhị phân với thư viện".
Gabe Johnson

3
Nếu bất cứ ai đang tìm kiếm điều này liên quan đến SpriteKit, 'thời gian hiện tại' trong phương pháp cập nhật của SKScene thực sự là CACienMediaTime ();
Anthony Mattox

92

Tôi đã điểm chuẩn tất cả các câu trả lời khác trên iPhone 4S và iPad 3 (bản phát hành bản dựng). CACurrentMediaTimecó ít chi phí nhất bởi một lề nhỏ. timeIntervalSince1970chậm hơn nhiều so với những cái khác, có lẽ là do NSDatechi phí khởi tạo, mặc dù nó có thể không quan trọng đối với nhiều trường hợp sử dụng.

Tôi muốn giới thiệu CACurrentMediaTimenếu bạn muốn có ít chi phí nhất và đừng bận tâm thêm phụ thuộc Quartz Framework. Hoặc gettimeofdaynếu tính di động là một ưu tiên cho bạn.

iPhone 4s

CACurrentMediaTime: 1.33 µs/call
gettimeofday: 1.38 µs/call
[NSDate timeIntervalSinceReferenceDate]: 1.45 µs/call
CFAbsoluteTimeGetCurrent: 1.48 µs/call
[[NSDate date] timeIntervalSince1970]: 4.93 µs/call

Ipad 3

CACurrentMediaTime: 1.25 µs/call
gettimeofday: 1.33 µs/call
CFAbsoluteTimeGetCurrent: 1.34 µs/call
[NSDate timeIntervalSinceReferenceDate]: 1.37 µs/call
[[NSDate date] timeIntervalSince1970]: 3.47 µs/call

1
+1, Mặc dù điều này rõ ràng rất nhiều thông tin và hữu ích, tôi sẽ không gọi chính xác đó là công việc kỹ thuật tuyệt vời mà không xem một số mã nguồn;)
Steven Lu

2
Cảnh giác với vấn đề này mặc dù: bentodson.com/weblog/2013/01/29/ca-civerse-media-time Đồng hồ này dường như dừng lại khi thiết bị đi ngủ.
mojuba

1
NSTimeIntervalSince1970macro là nhanh nhất.
ozgur

@ozgur NSTimeIntervalSince1970là một hằng số mô tả các giây giữa 1970-01-01 và "ngày tham chiếu" (tức là 2001-01-01), do đó, nó luôn luôn bằng với 980307200
YourMJK

53

Trong Swift chúng ta có thể tạo một hàm và làm như sau

func getCurrentMillis()->Int64{
    return  Int64(NSDate().timeIntervalSince1970 * 1000)
}

var currentTime = getCurrentMillis()

Mặc dù nó hoạt động tốt trong Swift 3.0 nhưng chúng ta có thể sửa đổi và sử dụng Datelớp thay vì NSDatetrong 3.0

Swift 3.0

func getCurrentMillis()->Int64 {
    return Int64(Date().timeIntervalSince1970 * 1000)
}

var currentTime = getCurrentMillis()

30

Cho đến nay tôi đã tìm thấy gettimeofdaymột giải pháp tốt trên iOS (iPad), khi bạn muốn thực hiện một số đánh giá khoảng thời gian (giả sử, tốc độ khung hình, thời gian của khung hiển thị ...):

#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);

2
Tôi cũng thích điều này vì nó rất di động. Lưu ý rằng tùy thuộc vào HĐH, bạn có thể cần sử dụng 'long long' thay vì 'long' và tương tự cast time.tv_sec thành 'long long' trước khi thực hiện phần còn lại của phép tính.
AbePralle

tĩnh không dấu dài getMStime (void) {struct timeval time; gettimeofday (& thời gian, NULL); trả về (time.tv_sec * 1000) + (time.tv_usec / 1000); }
David H

Điều thú vị là điều này hoạt động tốt trên iPhone 5S và Mac của tôi nhưng trả về giá trị sai trên iPad 3.
Hyndrix

Để tránh nhận được số âm, tôi phải bỏ trước toán học: int64_t result = ((int64_t) tv.tv_sec * 1000) + ((int64_t) tv.tv_usec / 1000);
jason gilbert

nó trở lại thời gian trong -ve
Shauket Sheikh

23

Để có được mili giây cho ngày hiện tại.

Swift 4+:

func currentTimeInMilliSeconds()-> Int
    {
        let currentDate = Date()
        let since1970 = currentDate.timeIntervalSince1970
        return Int(since1970 * 1000)
    }

18

Swift 2

let seconds = NSDate().timeIntervalSince1970
let milliseconds = seconds * 1000.0

Swift 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds

2
TimeIntervalaka Doublekhông có tài sản mili giây. Date().timeIntervalSince1970 * 1000
Leo Dabus

10

Có thể hữu ích khi biết về CodeTimestamp, cung cấp trình bao bọc xung quanh các hàm thời gian dựa trên mach. Điều này cung cấp cho bạn dữ liệu thời gian có độ phân giải nano giây - chính xác hơn 1000000x so với mili giây. Vâng, chính xác hơn một triệu lần. (Tiền tố là milli, micro, nano, chính xác hơn 1000 lần so với lần trước.) Ngay cả khi bạn không cần CodeTimestamp, hãy kiểm tra mã (đó là nguồn mở) để xem cách họ sử dụng mach để lấy dữ liệu thời gian. Điều này sẽ hữu ích khi bạn cần độ chính xác cao hơn và muốn một cuộc gọi phương thức nhanh hơn phương pháp NSDate.

http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/


Và có lẽ bạn sẽ cần -fno-objc-arcnếu bạn đang sử dụng ARC :)
Dan Rosenstark


3
Mã nguồn được liên kết từ trang ở đây: github.com/tylerneylon/moriarty
Tomas Andrle

8
// Timestamp after converting to milliseconds.

NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];

6

Tôi cần một NSNumberđối tượng chứa kết quả chính xác của [[NSDate date] timeIntervalSince1970]. Vì chức năng này đã được gọi nhiều lần và tôi không thực sự cần phải tạoNSDate đối tượng, hiệu suất không cao.

Vì vậy, để có được định dạng mà hàm ban đầu đã cho tôi, hãy thử điều này:

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;

Mà sẽ cho bạn kết quả chính xác như [[NSDate date] timeIntervalSince1970]


4

CFAbsoluteTimeGetCản ()

Thời gian tuyệt đối được đo bằng giây so với ngày tham chiếu tuyệt đối của ngày 1 tháng 1 năm 2001 00:00:00 GMT. Giá trị dương biểu thị một ngày sau ngày tham chiếu, giá trị âm biểu thị một ngày trước ngày đó. Ví dụ: thời gian tuyệt đối -32940326 tương đương với ngày 16 tháng 12 năm 1999 lúc 17:54:34. Các cuộc gọi liên tục đến chức năng này không đảm bảo kết quả tăng đơn điệu. Thời gian hệ thống có thể giảm do đồng bộ hóa với các tham chiếu thời gian bên ngoài hoặc do sự thay đổi rõ ràng của người dùng đồng hồ.


4

Thử cái này :

NSDate * timestamp = [NSDate dateWithTimeIntervalSince1970:[[NSDate date] timeIntervalSince1970]];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss.SSS"];

NSString *newDateString = [dateFormatter stringFromDate:timestamp];
timestamp = (NSDate*)newDateString;

Trong ví dụ này, dateWithTimeIntervalSince1970 được sử dụng kết hợp với bộ định dạng @ "YYYY-MM-dd HH: mm: ss.SSS" sẽ trả về ngày với năm, tháng, ngày và thời gian với giờ, phút, giây và mili giây . Xem ví dụ: "2015-12-02 04: 43: 15.008". Tôi đã sử dụng NSString để chắc chắn rằng định dạng sẽ được viết trước đó.


4

Về cơ bản, đây là câu trả lời tương tự như được đăng bởi @TristanLorach, vừa được mã hóa lại cho Swift 3:

   /// Method to get Unix-style time (Java variant), i.e., time since 1970 in milliseconds. This 
   /// copied from here: http://stackoverflow.com/a/24655601/253938 and here:
   /// http://stackoverflow.com/a/7885923/253938
   /// (This should give good performance according to this: 
   ///  http://stackoverflow.com/a/12020300/253938 )
   ///
   /// Note that it is possible that multiple calls to this method and computing the difference may 
   /// occasionally give problematic results, like an apparently negative interval or a major jump 
   /// forward in time. This is because system time occasionally gets updated due to synchronization 
   /// with a time source on the network (maybe "leap second"), or user setting the clock.
   public static func currentTimeMillis() -> Int64 {
      var darwinTime : timeval = timeval(tv_sec: 0, tv_usec: 0)
      gettimeofday(&darwinTime, nil)
      return (Int64(darwinTime.tv_sec) * 1000) + Int64(darwinTime.tv_usec / 1000)
   }

2
 func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)

}


1

Đây là những gì tôi đã sử dụng cho Swift

var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)

print("Time in milliseconds is \(currentTime)")

đã sử dụng trang web này để xác minh tính chính xác http://cienmillis.com/


1
let timeInMiliSecDate = Date()
let timeInMiliSec = Int (timeInMiliSecDate.timeIntervalSince1970 * 1000)
print(timeInMiliSec)

Vui lòng thêm một số giải thích cho mã của bạn để người khác có thể học hỏi từ nó - đặc biệt nếu bạn đăng câu trả lời cho câu hỏi đã có rất nhiều câu trả lời được nêu lên
Nico Haase

0

[NSDate timeIntervalSinceReferenceDate]là một tùy chọn khác, nếu bạn không muốn bao gồm khung Quartz. Nó trả lại gấp đôi, đại diện cho giây.


0
NSTimeInterval time = ([[NSDate date] timeIntervalSince1970]); //double
long digits = (long)time; //first 10 digits        
int decimalDigits = (int)(fmod(time, 1) * 1000); //3 missing digits
/*** long ***/
long timestamp = (digits * 1000) + decimalDigits;
/*** string ***/
NSString *timestampString = [NSString stringWithFormat:@"%ld%03d",digits ,decimalDigits];
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.