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.