2011-01-12 1 views
1

1600 년 1 월 1 일부터 처리해야하는 날짜가 저장되어 있습니다. 이것은 필자의 어플리케이션에서 여러 번 읽을 필요가있는 레거시 날짜 형식입니다.1600 년부터 NSDate까지의 날짜?

이전에, 나는이 같은 달력, 빈 날짜 구성 요소 및 루트 날짜 생성하고 있었다 :

[offset setDay: theLegacyDate]; 
id eventDate = [gregorian dateByAddingComponents: offset 
              toDate: rootDate 
             options: 0]; 
: 다음

self.gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar 
        ] autorelease]; 
id rootComponents = [[[NSDateComponents alloc] init] autorelease]; 
[rootComponents setYear: 1600]; 
[rootComponents setMonth: 1]; 
[rootComponents setDay: 1]; 
self.rootDate = [gregorian dateFromComponents: rootComponents]; 
self.offset = [[[NSDateComponents alloc] init] autorelease]; 

을 날짜로 나중에 정수를 변환, 나는 이것을 사용

은 (내가 다른 곳 오프셋에있는 값을 변경하지 않습니다.)

문제는 내가, 내가 midn 받고 있어요 맥 OS X에서 맥 OS X 대 iOS에서 rootDate에 대해 다른 시간을 얻고있다 ight. iOS에서는 8시 12 분 28 초에 도착합니다. (지금까지는 이것에 대해 일관된 것처럼 보입니다.) 나중에 며칠을 추가하면 기묘한 시간이 그대로 유지됩니다.

 
OS  | legacyDate | rootDate     | eventDate 
======== | ========== | ==========================|========================== 
Mac OS X | 143671  | 1600-01-01 00:00:00 -0800 | 1993-05-11 00:00:00 -0700 
iOS  | 143671  | 1600-01-01 08:12:28 +0000 | 1993-05-11 07:12:28 +0000 

이전 제품 릴리스에서는 시간에 신경 쓰지 않았습니다. 지금 나는 그렇다. 왜 iOS에서 이상한 시간을 보내고 무엇을해야합니까? (시간 차이가 DST라고 가정합니다.)

rootComponents의시, 분, 초를 0으로 설정해 보았습니다. 아무런 영향이 없습니다. 0 이외의 값으로 설정하면 8:12:28에 추가됩니다. 나는 이것이 윤초 또는 다른 누적 시계 변경과 관련이 있는지 궁금해하고있다.

아니면 iOS에서 완전히 잘못된 접근 방식입니까?

답변

1

올바른 대답은 간단하게 만드는 것 같습니다. rootDate를 만드는 대신 매번 구성 요소를 사용하여 날짜를 만듭니다. 이것은 더 느려서는 안되며 코드를 아이디어와 가깝게 유지합니다.

초기 설정 :

self.gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar 
        ] autorelease]; 
self.components = [[[NSDateComponents alloc] init] autorelease]; 
[components setYear: 1600]; 
[components setMonth: 1]; 

(. 물론, 속성과 인스턴스 변수가 조정)

나중에

는, 실제로 NSDate에 레거시 날짜를 변환 : 이것은이있다

[components setDay: 1 + theLegacyDate]; 
id eventDate = [gregorian dateFromComponents: components]; 

나를위한 이점 :

  1. 사용자 수가 적습니다.
  2. 코드가 적습니다.
  3. DST가 적용되는지 여부에 관계없이 항상 해당 날 자정을 반환합니다.아이폰 OS 계정으로 다양한 시간대에 매우 모호한 규칙을 소요
3

시간 문제를 고려한 누적 초/누적 시계 변경 사항에 대해 알고 있다고 생각합니다. 당신이 과거에 실제로 다루었던 날짜가 아니면 그것은 순전히 임의의 시대일까요?

어느 경우이든, 현재의 하루 (예 : 코코아 시대)에 훨씬 가까운 새로운 기원을 정의 할 수 있습니다. 새로운 신기원과 구 시대 사이의 일 델타를 계산하고 그것을 상수로 저장하십시오. 날짜를 처리해야하는 경우이 델타를 날짜에 적용한 다음 기존 NSCalendar 기술을 사용하지만 이전 시대 대신 새 신기원을 사용하십시오. 그것은 당신이보고있는 시계 표류 문제를 피할 수 있습니다.

+0

이 좋은 생각이지만, 불행하게도 여전히 +/- 1 시간 오류를 떠난다. –

0

참고. 1 월 1 일 자정이 될 가능성이 큽니다. 귀하의 시간대에서 1600은 실제로 UTC 7:12:28에있었습니다. 사람들이 날짜 변환에서 버그에 대해 불평을 늘어 놓은 사례가 많았는데 누군가 실제로 실제로 몇 년 전에 이상한 달력을 변경 한 시간대에 있다고 생각했습니다.

당신은 정확한있는 NSDate 데이터가 나타내는 첫번째 무엇인지 찾아야합니다. "1 월 16 일 1 일 이후의 일수"는 말도 안됩니다. 시간대가 필요하기 때문입니다! 당신이해야 할 일 : 그것이 표현하기로되어있는 날을 알고있는 곳에 "유산"번호를 찾으십시오. 예를 들어, 143671이 1993 년 5 월 11 일 사용자의 시간대에 있어야한다고 "알았다"면 그 날짜를 루트 날짜로 시작하여 (x - 143671) 일을 추가하십시오.