답변:
[[NSDate date] timeIntervalSince1970];
에포크 이후의 초 수를 double로 리턴합니다. 분수 부분에서 밀리 초에 액세스 할 수 있다고 확신합니다.
[NSDate timeIntervalSinceReferenceDate]
더 싸다. (이것은 다른 "에포크"를 참조하지만 1970 년에 상수를 추가하려는 경우 NSTimeIntervalSince1970
)
상대 타이밍 (예 : 게임 또는 애니메이션)에 이것을 사용하려면 CACurrentMediaTime ()을 사용하는 것이 좋습니다
double CurrentTime = CACurrentMediaTime();
권장되는 방법은 무엇입니까? NSDate
네트워크 동기화 시계에서 가져오고 네트워크와 다시 동기화 할 때 가끔 딸꾹질합니다.
현재 절대 시간을 초 단위로 반환합니다.
소수 부분 만 원할 경우 (애니메이션 동기화시 종종 사용됨)
let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
iPhone 4S 및 iPad 3 (릴리스 빌드)에서 다른 모든 답변을 벤치마킹했습니다. CACurrentMediaTime
작은 마진으로 오버 헤드가 가장 적습니다. 인스턴스화 오버 헤드 timeIntervalSince1970
로 인해 다른 것보다 훨씬 느리지 만 NSDate
많은 사용 사례에는 중요하지 않을 수 있습니다.
CACurrentMediaTime
오버 헤드를 최소화하고 Quartz Framework 종속성을 추가하지 않아도되는 것이 좋습니다 . 또는 gettimeofday
이식성이 우선 순위 인 경우.
아이폰 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
아이 패드 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
가장 빠른 매크로 가 있습니다 .
NSTimeIntervalSince1970
는 1970-01-01과 "참조 날짜"(예 : 2001-01-01) 사이의 초를 나타내는 상수이므로 항상 978307200
Swift에서는 다음과 같이 기능을 수행 할 수 있습니다.
func getCurrentMillis()->Int64{
return Int64(NSDate().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
그가에서 잘 작동하지만 스위프트 3.0 그러나 우리는 수정하고 사용할 수있는 Date
대신 클래스 NSDate
에 3.0
스위프트 3.0
func getCurrentMillis()->Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
지금까지 gettimeofday
일부 간격 평가 (예 : 프레임 속도, 렌더링 프레임 타이밍 ...)를 수행하려는 경우 iOS (iPad)에서 좋은 해결책을 찾았 습니다.
#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
Mach 기반 타이밍 함수에 대한 래퍼를 제공하는 CodeTimestamp에 대해 아는 것이 유용 할 수 있습니다. 이는 나노초 분해능 타이밍 데이터를 제공합니다-밀리 초보다 1000000 배 더 정확합니다. 예, 백만 배 더 정확합니다. (접두사는 밀리, 마이크로, 나노로 각각 1000x가 마지막보다 정확합니다.) CodeTimestamp가 필요하지 않더라도 코드 (오픈 소스)를 확인하여 mach를 사용하여 타이밍 데이터를 얻는 방법을 확인하십시오. NSDate 방식보다 더 정밀하고 빠른 메소드 호출을 원할 때 유용합니다.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
-fno-objc-arc
ARC를 사용한다면 아마 필요할 것입니다 :)
NSNumber
의 정확한 결과를 포함 하는 객체가 필요했습니다 [[NSDate date] timeIntervalSince1970]
. 이 함수는 여러 번 호출되었으므로 실제로는NSDate
객체 성능이 좋지 않았습니다.
따라서 원래 함수가 제공 한 형식을 얻으려면 다음을 시도하십시오.
#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;
다음과 정확히 동일한 결과를 제공해야합니다. [[NSDate date] timeIntervalSince1970]
절대 시간은 2001 년 1 월 1 일 00:00:00 GMT의 절대 참조 날짜를 기준으로 초 단위로 측정됩니다. 양수 값은 참조 날짜 이후의 날짜를 나타내고 음수 값은 이전 날짜를 나타냅니다. 예를 들어 절대 시간 -32940326은 1999 년 12 월 16 일 17:54:34와 같습니다. 이 함수를 반복해서 호출한다고해서 단조 증가하는 결과는 보장되지 않습니다. 시스템 시간은 외부 시간 참조와의 동기화 또는 시계의 명시적인 사용자 변경으로 인해 줄어들 수 있습니다.
이 시도 :
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;
이 예에서 dateWithTimeIntervalSince1970은 포맷터 @ "YYYY-MM-dd HH : mm : ss.SSS"와 함께 사용되어 년, 월, 일 및 시간,시, 분, 초 및 밀리 초로 날짜를 리턴합니다. . 예 : "2015-12-02 04 : 43 : 15.008"을 참조하십시오. NSString을 사용하여 형식이 이전에 작성되었는지 확인했습니다.
이것은 기본적으로 @TristanLorach가 게시 한 것과 같은 대답이며 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)
}
이것이 내가 스위프트에 사용한 것입니다.
var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)
print("Time in milliseconds is \(currentTime)")
이 사이트를 사용하여 정확성을 확인했습니다 http://currentmillis.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];