NSDate를 유닉스 타임 스탬프 아이폰 SDK로 변환하는 방법?


143

NSDate을 Unix 타임 스탬프 로 변환하는 방법 ? 나는 반대로하는 많은 게시물을 읽었습니다. 그러나 내 질문과 관련된 것을 찾지 못했습니다.

답변:


269

나는 이것이 당신이 찾고있는 NSDate의 선택기라고 생각합니다.

- (NSTimeInterval)timeIntervalSince1970

2
nsdate가 제공된 경우 유닉스 타임 스탬프를 반환합니까?
neha

1
예, 이것이 바로 당신이 찾고있는 것입니다. UNIX는 1970 년 1 월 1 일 이후의 시간을 초 단위로 측정하며,이 메소드는 수신자 (제공 한 NSDate)와 1970 년 1 월 1 일 첫 번째 GMT 사이의 간격을 리턴합니다. NSTimeInterval은 실제로 double의 typedef입니다.
BAndonovski

26
문자열을 얻으려면 (28/11/2011 14:14:13 <-> 1322486053) : [NSString stringWithFormat : @ "%. 0f", [aDate timeIntervalSince1970]];
ıɾuǝʞ

2
방법은 일반적으로 장치에 설정된 시간에 따라 변경됩니다. 나는 오후 12시에 타임 스탬프를 얻은 다음 iPad에서 시간을 약 8pm으로 변경 한 테스트를 수행했으며 두 숫자의 차이는 매우 높았습니다. 타임 스탬프가 따라 숫자가 단순한 초 해제 했어야 어떤 장치 시간이었다,하지만이 경우에 나는 아이 패드의 시간을 위해 UnixTimeStamp에 영향을 미치지 않는 것으로 결론을했다
Esko918

1
@ Esko918 물론입니다. 유닉스 시간은 1970 년에서 지정한 시점까지의 시간 (초)을 나타냅니다 (이 경우 "지금"). iPad에서 시간을 변경하면 "지금"을 다른 시간으로 효과적으로 변경하므로 타임 스탬프의 차이가 발생합니다.
marsbear

69

유닉스 타임 스탬프는 1970 년 1 월 1 일 0시 0 분 0 초 (UTC)부터 (초)입니다 그것은 형식으로 표시 것 time_t 일반적으로 부호있는 32 비트 정수 타입 (긴 또는 INT)이다.

iOS는 1970 년 1 월 1 일 00:00:00 GMT 이후의 초 수를 반환하는 NSDate 객체에 대해 -(NSTimeInterval) timeIntervalSince1970 을 제공합니다 . NSTimeInterval은 이중 부동 소수점 유형이므로 초와 분수를 얻을 수 있습니다.

둘 다 동일한 참조 (자정 1Jan1970 UTC)와 초 단위로 변환하기 쉽기 때문에 NSTimeInterval을 time_t로 변환하고 필요에 따라 반올림하거나 잘립니다.

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];

이 기능은 정확한 날짜를 보여 주지만 시간은 틀립니다. 시스템 시간과 일치하지 않습니다.
neha

유닉스 시간은 UTC (GMT), 인도는 UTC + 5.5입니다. 5.5 시간이 지났습니까?
progrmr

7
시스템 시간이 현지 시간대의 시간을 표시하고 있습니다. 유닉스 타임 스탬프는 현지 시간이 아니며 항상 UTC 시간입니다. 인도에서 +5 : 30, 여기에서 -7 : 00까지 다릅니다. 맞습니다.
progrmr

그러나 어떻게 사용합니까? 나중에 계산에 사용할 수 있습니까? 온라인으로 PHP 데이터베이스에서 유닉스 타임 스탬프가 하나 있습니다. 객체에 대한 최신 데이터를 다운로드하기로 결정하기 위해 두 가지를 비교하고 싶습니다.
JeroenEijkhof

나는 단지 이것을 지금하고있다 : int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) piece.piece.last_view는 NSDate이다
JeroenEijkhof

26

이 방법으로 날짜로부터 유닉스 타임 스탬프 날짜를 만들 수 있습니다.

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
timeIntervalSince1970은 실제로는 Double 인 TimeInterval을 반환합니다.
매트 울프

9
- (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;
    }

참고 :-타임 스탬프는 UTC 영역에 있어야하므로 현지 시간을 UTC 시간으로 변환합니다.


6

빠른

스위프트 3 업데이트

// current date and time
let someDate = Date()

// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970

노트

  • timeIntervalSince1970TimeInterval의 유형 별칭 인을 반환합니다 Double.

  • 다른 방법으로 가고 싶다면 다음을 수행하십시오.

      let myDate = Date(timeIntervalSince1970: myTimeStamp)

5

이 시간을 데이터베이스에 저장하거나 서버를 통해 보내려면 Unix 타임 스탬프를 사용하는 것이 가장 좋습니다. 여기에 약간의 스 니펫이 있습니다.

+ (NSTimeInterval)getUTCFormateDate{

    NSDateComponents *comps = [[NSCalendar currentCalendar] 
                               components:NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit 
                               fromDate:[NSDate date]];
    [comps setHour:0];
    [comps setMinute:0];    
    [comps setSecond:[[NSTimeZone systemTimeZone] secondsFromGMT]];

    return [[[NSCalendar currentCalendar] dateFromComponents:comps] timeIntervalSince1970];  
}

구성 요소에서시와 분을 0으로 설정하는 이유는 무엇입니까? 또한 이것을 기반으로 정확한 UTC를 제공하는 방법은 [[NSTimeZone systemTimeZone] secondsFromGMT]]무엇입니까? 조금만 설명해주세요.
Hemang

안녕하세요 친구 도움이되었습니다
Rahul K Rajan

5

내가 선호하는 방법은 간단합니다.

NSDate.date.timeIntervalSince1970;

4

다음과 같이 UNIX 시간 함수를 사용하는 @ kexik의 제안에 따라 :

  time_t result = time(NULL);
  NSLog([NSString stringWithFormat:@"The current Unix epoch time is %d",(int)result]);

. 내 경험에 따르면-timeIntervalSince1970을 사용하지 마십시오. 에포크 타임 스탬프-GMT 뒤에있는 시간 (초)을 제공합니다.

[[NSDate date] timeIntervalSince1970]의 버그가 있었으며, 전화 시간대를 기반으로 시간을 더하거나 뺄 때 사용되었지만 지금은 해결 된 것 같습니다.


나는 내 대답을 수정하고 있습니다. 정말 동일합니다. 시간 (NULL)은 obj-c 런타임을 호출하지 않으므로 조금 더 빠를 수 있습니다. : P 테스트 코드 NSLog (@ "time (NULL) = % d; timeIntervalSince1970 = % d", (int) time (NULL), (int) [[NSDate 날짜] timeIntervalSince1970]);
k3a

[[NSDate date] timeIntervalSince1970]에 문제가 있습니다. 그들은 당신이있는 지역을 고려하는 것 같습니다.
Tapan Thaker

예, 이것이 제가 그날 경험 한 것 같지만 GMT + 2 시간대가있는 iOS7 Simulator 및 iOS6 기기에서는 이제 동일하게 보입니다 ... 어쨌든, time (NULL) 항상 작동 :)
k3a

2
 [NSString stringWithFormat: @"first unixtime is %ld",message,(long)[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"second unixtime is %ld",message,[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"third unixtime is %.0f",message,[[NSDate date] timeIntervalSince1970]]; 

최초 유닉스 타임 1532278070

두 번째 유닉스 타임 1532278070.461380

세 번째 유닉스 타임 1532278070


0

문자열로 타임 스탬프가 필요한 경우

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.