Câu trả lời:
[[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.
[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
.)
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ị; NSDate
rú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)
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). CACurrentMediaTime
có ít chi phí nhất bởi một lề nhỏ. timeIntervalSince1970
chậm hơn nhiều so với những cái khác, có lẽ là do NSDate
chi 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 CACurrentMediaTime
nế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 gettimeofday
nế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
NSTimeIntervalSince1970
macro là nhanh nhất.
NSTimeIntervalSince1970
là 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
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 Date
lớp thay vì NSDate
trong 3.0
Swift 3.0
func getCurrentMillis()->Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Cho đến nay tôi đã tìm thấy gettimeofday
mộ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);
Để 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)
}
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/
-fno-objc-arc
nếu bạn đang sử dụng ARC :)
// Timestamp after converting to milliseconds.
NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
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]
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ồ.
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 đó.
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)
}
func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)
}
Đâ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/
let timeInMiliSecDate = Date()
let timeInMiliSec = Int (timeInMiliSecDate.timeIntervalSince1970 * 1000)
print(timeInMiliSec)
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];