아이폰 : 현재 밀리 초를 얻는 방법?


답변:


273
[[NSDate date] timeIntervalSince1970];

에포크 이후의 초 수를 double로 리턴합니다. 분수 부분에서 밀리 초에 액세스 할 수 있다고 확신합니다.


29
NSTimeInterval myInterval = NSDate.timeIntervalSince1970; // 당신이 나에게 묻는다면 모든 대괄호는 구식입니다.
Pizzaiola Gorgonzola


119
"괄호"는 객관적이다. c. iOS 용으로 개발하고 싶다면 아마도 익숙 할 것입니다.
Ampers4nd

5
나는이 방법을 한동안 사용해 왔으며 몇 밀리 초 후에 호출 할 때 이전 값을 반환 할 수 있다는 것을 깨달았다 (예 : 연속적으로 호출하면 증가하는 순서로 끝나지 않을 수 있음)
Ege Akpinar

5
[NSDate timeIntervalSinceReferenceDate]더 싸다. (이것은 다른 "에포크"를 참조하지만 1970 년에 상수를 추가하려는 경우 NSTimeIntervalSince1970)
핫 릭

311

상대 타이밍 (예 : 게임 또는 애니메이션)에 이것을 사용하려면 CACurrentMediaTime ()을 사용하는 것이 좋습니다

double CurrentTime = CACurrentMediaTime();

권장되는 방법은 무엇입니까? NSDate네트워크 동기화 시계에서 가져오고 네트워크와 다시 동기화 할 때 가끔 딸꾹질합니다.

현재 절대 시간을 초 단위로 반환합니다.


소수 부분 원할 경우 (애니메이션 동기화시 종종 사용됨)

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

7
그러나 [[NSDate date] timeIntervalSince1970]에 필요한 시간이 두 배로 걸린 것 같습니다. 15000 통화에서 0.065ms 대 0.033ms를 측정했습니다.
Kay

1
이 호출을하려면 Quartz Framework와 #import <Quartz / CABase.h>를 포함해야합니다.
BadPirate

8

6
Xcode를 처음 접하는 사람들에게는 "포함 Quartz Framework"는 "바이너리와 바이너리 연결"의 라이브러리 세트에 추가하는 것을 의미합니다.
Gabe Johnson

3
SpriteKit과 관련하여 누군가 이것을 찾고 있다면 SKScene의 업데이트 방법에서 '현재 시간'은 실제로 CACurrentMediaTime ()입니다.
Anthony Mattox

92

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

1
+1, 이것은 매우 유익하고 도움이 되긴하지만 소스 코드를 보지 않고서는 훌륭한 엔지니어링 작업이라고 부르지 않을 것입니다.)
Steven Lu

2
이 문제에주의하십시오. bendodson.com/weblog/2013/01/29/ca-current-media-time 이 시계는 장치가 절전 모드로 전환 될 때 중지됩니다.
mojuba

1
NSTimeIntervalSince1970가장 빠른 매크로 가 있습니다 .
ozgur

@ozgur NSTimeIntervalSince1970는 1970-01-01과 "참조 날짜"(예 : 2001-01-01) 사이의 초를 나타내는 상수이므로 항상 978307200
YourMJK

53

Swift에서는 다음과 같이 기능을 수행 할 수 있습니다.

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

var currentTime = getCurrentMillis()

그가에서 잘 작동하지만 스위프트 3.0 그러나 우리는 수정하고 사용할 수있는 Date대신 클래스 NSDate3.0

스위프트 3.0

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

var currentTime = getCurrentMillis()

30

지금까지 gettimeofday일부 간격 평가 (예 : 프레임 속도, 렌더링 프레임 타이밍 ...)를 수행하려는 경우 iOS (iPad)에서 좋은 해결책을 찾았 습니다.

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

2
휴대용이므로 매우 마음에 듭니다. OS에 따라 나머지 계산을 수행하기 전에 'long'대신 'long long'과 캐스트 시간을 사용해야합니다.
AbePralle

정적 부호없는 long getMStime (void) {struct timeval time; gettimeofday (& time, NULL); 리턴 (time.tv_sec * 1000) + (time.tv_usec / 1000); }
David H

흥미롭게도 이것은 내 iPhone 5S와 Mac에서 잘 작동하지만 iPad 3에서는 잘못된 값을 반환합니다.
Hyndrix

음수를 얻지 않으려면 수학 전에 캐스팅해야했습니다. int64_t result = ((int64_t) tv.tv_sec * 1000) + ((int64_t) tv.tv_usec / 1000);
Jason Gilbert

그것은 - 제가 시간을 반환
Shauket 셰이크

23

현재 날짜의 밀리 초를 가져옵니다.

스위프트 4+ :

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

18

스위프트 2

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

스위프트 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds

2
TimeInterval일명 Double밀리 초 속성이 없습니다. Date().timeIntervalSince1970 * 1000
Leo Dabus

10

Mach 기반 타이밍 함수에 대한 래퍼를 제공하는 CodeTimestamp에 대해 아는 것이 유용 할 수 있습니다. 이는 나노초 분해능 타이밍 데이터를 제공합니다-밀리 초보다 1000000 배 더 정확합니다. 예, 백만 배 더 정확합니다. (접두사는 밀리, 마이크로, 나노로 각각 1000x가 마지막보다 정확합니다.) CodeTimestamp가 필요하지 않더라도 코드 (오픈 소스)를 확인하여 mach를 사용하여 타이밍 데이터를 얻는 방법을 확인하십시오. NSDate 방식보다 더 정밀하고 빠른 메소드 호출을 원할 때 유용합니다.

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


그리고 -fno-objc-arcARC를 사용한다면 아마 필요할 것입니다 :)
Dan Rosenstark


3
페이지에서 링크 된 소스 코드는 다음과 같습니다 : github.com/tylerneylon/moriarty
Tomas Andrle

8
// Timestamp after converting to milliseconds.

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

6

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]


4

CFAbsoluteTimeGetCurrent ()

절대 시간은 2001 년 1 월 1 일 00:00:00 GMT의 절대 참조 날짜를 기준으로 초 단위로 측정됩니다. 양수 값은 참조 날짜 이후의 날짜를 나타내고 음수 값은 이전 날짜를 나타냅니다. 예를 들어 절대 시간 -32940326은 1999 년 12 월 16 일 17:54:34와 같습니다. 이 함수를 반복해서 호출한다고해서 단조 증가하는 결과는 보장되지 않습니다. 시스템 시간은 외부 시간 참조와의 동기화 또는 시계의 명시적인 사용자 변경으로 인해 줄어들 수 있습니다.


4

이 시도 :

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을 사용하여 형식이 이전에 작성되었는지 확인했습니다.


4

이것은 기본적으로 @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)
   }

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

}


1

이것이 내가 스위프트에 사용한 것입니다.

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

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

이 사이트를 사용하여 정확성을 확인했습니다 http://currentmillis.com/


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

다른 사람들이 배울 수 있도록 코드에 설명을 추가하십시오. 특히 이미 많은 답변이있는 질문에 대한 답변을 게시하는 경우
Nico Haase

0

[NSDate timeIntervalSinceReferenceDate]Quartz 프레임 워크를 포함하지 않으려는 경우 다른 옵션입니다. 초를 나타내는 double을 반환합니다.


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];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.