2012-03-01 3 views
1

윤년의 경우 [NSDate date]2012-03-01 HH:MM:SS +TTTT을 반환합니다.[NSDate date] 및 윤년 문제

나는 종종 [NSDate date]을 호출하여 오늘 날짜가 검색되는 게시물을 보았습니다. 문제는 윤년에 올바른 날짜를 반환하지 않는다는 것입니다. 이제 나는 윤년이 실제로 달력 시스템의 함수라는 것을 알고 있기 때문에 NSDate은 윤년 (또는 일광 절약 시간)을 인식하지 못한다는 것을 이해합니다. 이 때 볼 수있는 비교를 다음

// assume today's date is 2012-02-29 10:00:00 +0000 
NSDate *fileModificationDate = [NSDate date]; // 2012-03-01 10:00:00 +0000 is returned 

을 미래의 어떤 시점에서 :

당신이 수행하여 파일의 수정 날짜를 지정 말 : 예를 들면 - 그러나,이 코드의 파괴를 난파 할 수있는 잠재력을 가지고 파일이 마지막으로 수정되었습니다

// assume it's the next day at 9 AM, ie 2012-03-01 09:00 +0000 
NSTimeInterval timeSinceLastModification = [fileModificationDate timeIntervalSinceNow]; 

(가) timeSinceLasModification 긍정적있을 것입니다 반환, 이해되지 않는다 미래의 시간을 의미!

제 질문은 : 실제로 현재 날짜를 얻으려면 [NSDate date]을 사용하는 것은 나쁜 습관입니까? 여기서 중요한 걸 놓치고 있니? 당신이 NSDate가 윤일 지원하지 않는 아이디어를 어디서 얻었 긴 숨이 질문에 대한 죄송합니다

...

+0

No-repro. NSLog를 통해'NSDate date '를 인쇄하면 하루 종일 2/29가 표시됩니다. 너의 시간대가 뭐니? 어떻게 날짜를 표시하고 있습니까? –

답변

8

는 모르겠지만, 그것은 절대적으로 잘못입니다. 지금 GMT에서 날짜 문자열이 2012-03-01 03:42:07 +0000이기 때문에 혼란스러워하고 있다고 생각합니다. 이것은 입니다. 올바른입니다. GMT에서는 이미 3 월 1 일입니다. 그러나 현재 로케일 (예 : [[NSDate date] descriptionWithLocale:[NSLocale currentLocale]])의 날짜를 묻는 경우 정확한 값으로 윤년을받습니다. PST에서 나를 위해, 그것은 NSDate 자체가 로케일을 인식하지 못하는 것을

이 2012년 2월 29일 (수요일) 오후 7시 42분 46초 태평양 표준 시간

주입니다. 내가 만든 유일한 변화는 GMT를 사용하는 대신 현재 로케일을 사용하여 문자열 표현을 반환하도록 요청하는 것입니다. 나는 같은 날짜 객체를 가져 와서 EST를 요청할 수 있습니다. 그러면 그 시간대에 대해서도 정확한 문자열을 줄 것입니다.

+0

와우 ... 나는 그것에 관해 주워주지 않는 것에 대해 절대적으로 우스꽝 스럽다! 대답 해 주셔서 감사합니다. Kevin, 당신은 완전합니다! NSDate는 실제로 일광 절약 시간제 같은 것들을 설명합니까? ... 나는 그것에 대해 무언가를 읽을 것을 맹세 했었을 수도 있습니다. –

+1

기술적/엄격하게/보행자 적으로 (그러나 나는 이것이 당신의 요점을 강화한다고 믿습니다)'NSDate' _doesn't_ " 지원 "윤년 - 그것은 캘린더/로케일의 기능입니다. 'NSDate'는 단지 시점 일뿐입니다. 라벨이나 설명을 제공하는 것은 달력 시스템에 달려 있습니다. –

+0

@JoshCaswell 나는 Kevin이 말한 것은 우리가 GMT 시간에 PST에 있었기 때문에 실제로 3 월 1 일이라고 생각한다 - 하루가 빠르면'NSDate date '라고 불렀고 일부는 2 월 29 일에 반환했을 것이다. 시각. –