2014-02-16 2 views
0

2 개월 전 App Store에 첫 번째 앱을 출시했으며 지금까지 성공했습니다. 나는 최근에 그러나 문제를 발견했다.iOS 앱 다른 시간대 치료 날짜 항목

응용 프로그램의 전제는 주어진 돈 봉투를 추적 할 수있게하는 것입니다. 그것은 항목을 추가 할 수있는 간단한 응용 프로그램이며 탭 모음에서 다른 탭의 이름, 이벤트 및 연도로 필터링 한 다음 시간순 타임 라인을 표시합니다. 시간대를 변경할 때를 제외하고는 전 세계에서 잘 작동합니다.

앱은 NSPredicate 수표를 포함하여 백그라운드에서 핵심 데이터를 사용합니다. "내가 선택한 올해가 이미 존재한다면 반환 할 것이고 그렇지 않으면 반환 할 것입니다. 올해의 새 항목을 만듭니다." . 따라서 2014 년 한 항목과 2013 년 2013 년 중 하나가있는 경우 연도 탭에 2014 년 한 항목과 2013 년 한 항목이 표시됩니다. 2014 년에 다른 항목을 추가하면 두 항목이 모두 표시되지 않습니다. 1 년 탭이지만 여전히 2014 년 단일 항목이 있습니다 (아래의 모든 거래가 포함됨).

날짜는 UIDatePicker을 사용하여 선택되어 실제 날짜를 얻습니다.

시간대를 변경할 때 문제가 발생합니다. 이렇게하면 연도가 2014 인 항목이 이전 2014 년과 동일한 항목으로 더 이상 인식되지 않으므로 올해 탭에서 여러 개의 2014 항목으로 끝납니다. 물론 이해가되지 않습니다.

타이밍과 관련되어 있다는 것을 알았습니다. 시간대를 사용하지 않고, NSGregorianCalendar 기능을 사용하고 있습니다. 내가 말 GMT의 시간대를 지정 가야하지만 때문에 일광 절약 등의, 내가 '얼마나 (내가 그것을 같은 방식으로 작업 할) 응용 프로그램의 너무 많은 여기에 기능을 변경하지 않고

NSCalendar *yearCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *yearComponent = [yearCal components:NSYearCalendarUnit fromDate:self.datePicker.date]; 
NSDate *selectedYear = [yearCal dateFromComponents:yearComponent]; 

, d를 표준으로 12시 GMT와 같은 것으로 유지하고 싶으므로 세계 어느 곳에 있더라도 시간은 GMT 12시에 초점을 맞출 것입니다.

나는 이것이 의미가 있지만 모든 도움을 주시면 감사하겠습니다.

감사합니다,

+0

일반적으로 GMT 시간대가있는 dateFormatter를 사용하여 날짜 문자열을 구문 분석하고 날짜 문자열을 제로 시간대 (예 : @ "01/01/2014 +000")로 보내거나 받고 있습니다. 'NSDateFormatter * dateFormatter = [NSDateFormater new]; [dateFormatter setTimeZone : [NSTimeZone timeZoneForSecondsFromGMT : 0]]'.그 정확한 해결책은 확실하지 않지만 내 요구에 잘 맞습니다. –

+0

친애하는 Mykola - 답장을 많이 보내 주셔서 감사합니다. 마틴의 답변을 사용하여이 작업을 수행했지만 잘 이해하고 있습니다. 감사드립니다. – amitsbajaj

답변

2

시간대는 항상 당신의 날짜 속성의 의미를 고려해야합니다 .. 다루는 매우 까다로운 있습니다 (예 : 호주에서 2014 년에 입력 된 값이 '2014 년'으로 표시해야하는 경우 또는 '2013 년에'가정용 시간대 '가 2013 년에 미국에 있기 때문에)

NSCalendar는 UIDatePicker (및 NSTimeFormatter와 마찬가지로 현재 po date을 사용하는 것처럼 현재 로컬 시간대를 사용하도록 기본 설정됩니다. 디버거에서). 첫 번째 조언은 DB에 별도의 필드로 연도를 저장하는 것입니다.

그러나 날짜 값을 특정 표준 시간대로 '표준화'하려는 경우 NSDateComponents에 UTC 시간대는 UTC에서 올해의 첫 순간을 얻을 수 있습니다 :

NSCalendar *yearCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *yearComponent = [yearCal components:NSYearCalendarUnit fromDate:self.datePicker.date]; 
[yearComponent setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]] 
NSDate *selectedYear = [yearCal dateFromComponents:yearComponent]; 

이것은 (UIDatePicker의와 동일해야합니다) NSCalendar의 자신의 시간대 속성을 재정의합니다.

+0

안녕 마틴 - 답장을 보내 주셔서 감사 드리며 늦게 회신 해 주셔서 감사합니다. (몇 일간 미친 듯이 보였습니다.)하지만 코드가 정말 도움이되어이 버그가 제거되었습니다. 이는 실제로 도움이되었으며 UTC 시간대를 사용하는 것이 좋습니다. 그 점에 대해 많은 감사를드립니다. – amitsbajaj