2014-11-06 1 views
0

요즘에는 EST 시간을 찾아야합니다. 그러나이 기능을 사용하면 잘못된 시간을 내게 돌려 줄 것이며, 실수를하거나 나는 틀린 부호를 썼다, 어느 것이 든 방법에있는 나를 몰 수있는 것은 높게 평가할 수있을 것입니다. 응답이 그렇게 될 것입니다목표 -c iOS에서 현재 날짜를 찾으십시오. iOS

@ROB : "close_ts"= "2014-11-21T01 : 25 : 00"

+ (NSDate *)currentESTDate 
{ 
    NSString *formatterDate = @"yyyy-MM-dd HH:mm:ss"; 

    NSDate* date = [NSDate date]; 
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; 
    [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]]; 
    [formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]]; 
    [formatter setDateFormat:formatterDate]; 
    NSString* currentDateStamp = [formatter stringFromDate:date]; 
    NSDate * returnDate = [formatter dateFromString:currentDateStamp]; 

    if(returnDate) 
    { 
     return returnDate; 
    } 
    return nil; 
} 
+0

현재 날짜를 문자열로 변환 한 다음 해당 문자열을 날짜로 변환하고 그 날짜를 반환하는 것은 무엇입니까? 왜 그냥 [NSDate date]를 그대로 사용하지 않는가? – rmaddy

+0

@rmaddy 현재 형식은 현재 형식이어야하지만 NSString * currentDateStamp = [formatter stringFromDate : date]; 이 문자열 형식으로 정확한 시간을 반환합니다, 나는 날짜 formate에서 다시 변환해야하므로 [formatter dateFromString : currentDateStamp] 이것은 잘못된 시간을 줄 것입니다. – Spynet

+2

Rob의 답변을 참조하십시오. 날짜가 어떻게 작동하는지 혼란 스러울 것 같습니다. – rmaddy

답변

2

당신은 시간이 2014-11-21T01:25:00로보고됩니다 말한다. 그 숫자는 보통 RFC 3339/ISO 8601입니다. 보통이다, 구문 분석하는 방법에 대한 애플의 Technical Q&A QA1480 정보를 참조하십시오

NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.locale = enUSPOSIXLocale; 
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss"; 
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 
NSDate *date = [formatter dateFromString:timeStamp]; 

참고,이 형식으로, 타임 스탬프가 GMT하지 EST에 거의 항상이다. 이러한 모호성을 없애기 위해 서버에서 가져 오는 대부분의 날짜 문자열은 일반적으로 마지막에 Z입니다. 2014-11-21T01:25:00Z에 'Zulu'의 날짜가 명확하게 선언되어 있습니다 (예 : GMT/UTC). 표준 시간대 정보가 없어도 일반적으로이 값은 여전히 ​​GMT 일 것으로 예상됩니다. 실제로 그것이 EST이라는 사실을 알고 있다면 (매우 의심 스럽지만 매우 특이 할 것입니다), 을 사용하여 위의 timeZone 행을 변경하십시오.

이렇게하면 서버에서받은 날짜 문자열을 NSDate 개로 변환 할 수 있습니다. 그런 다음 과 isEndDate:isSmallerThanCurrent: 루틴을 비교해 볼 수 있습니다. 그러나 NSDate을 다른 시간대로 변환하지 마십시오.


currentESTDate은 잘못된 시간을 나타냅니다. NSDateFormatter은 EST의 현재 날짜와 시간을 currentDateStamp 변수로 계산합니다. 그러나 원래 값인 NSDate 값을 검색하면 다시 변환됩니다. 따라서이 루틴은 필요하지 않습니다.

명확하게 말하면 NSDate 개체에는 시간대가 없습니다. 그것들은 전 세계에 걸쳐 동일한 시간을 나타냅니다. 시간대는 날짜를 문자열로 변환 할 때만 적용됩니다 (NSDateFormatter 통해).

따라서 문제는 "[NSDate date]을 특정 시간대로 변환하는 방법"이 아닙니다. 문제는 서버의 2014-11-21T01:25:00 문자열을 유효한 NSDate 개체 (다른 NSDate 개체와 비교할 수 있음)로 변환하는 방법입니다. 그리고 위의 코드가이 질문에 대한 답변을 얻길 바랍니다.

+0

실제로 내 주요 관심사는 2 개의 날짜를 비교하는 것입니다. 하나는 서비스가 EST 날짜를 반환하고 현재 날짜를 현재 EST 날짜로 변환해야합니다. 그런 다음 마지막으로 작동합니다. fullday 나는 모든 가능한 것들을 분석하고 검색했지만, 아이디어가있어. – Spynet

+0

제 질문은 집행입니까? .... pls는 나를 제안한다 – Spynet

+1

@Spynet 그래, 그것은 복제품이다. 그러나 이것이 당신이 이미 대답을 알지 못한다면 좋은 대답을 찾기가 어렵다는 질문들 중의 하나이다. 롤. '2014-11-21T01 : 25 : 00' 형식의 구문 분석과 관련하여 "[ios] nsdate t"를 검색합니다 (그러나 많은 답변이'locale '설정의 미묘함을 무시합니다). 원래의 NSDate/timezone 질문과 관련하여 "현재 시간대"를 검색하면 몇 가지 유망한 링크를 찾을 수 있습니다 (NSDate 및 시간대에 대한 오해는 꽤 흔한 일입니다. 기분이 나쁘다). – Rob