1

현재 학교 일정을 다루는 일정 응용 프로그램을 만들고 있습니다. 각 일정에는 시작 시간과 종료 시간을 모두 포함하는 기간 개체 배열이 있습니다. 현재 나는이 시간을 NSDate 객체로 저장합니다. 단지 시간 만이 관련이 있고 각 NSDate 객체는 내 응용 프로그램에별로 중요하지 않은 임의의 날짜를 가지고 있습니다 (UIDatePicker가 할당 한 것은 무엇이든간에 TimePickerMode 만 사용합니다).). 나는이 날짜들에 여러 가지 일을한다. 먼저 NSDateFormatter를 사용하여 UITableView의 각 기간에 대한 시간의 문자열 표현을 출력합니다. 그런 다음 [NSDate date]에 의해 가져온 현재 시간을 시작 및 종료 시간과 비교하여 해당 날짜의 현재 기간을 찾으려고 시도합니다. 하지만이 작업을 수행하는 가장 좋은 방법을 결정하는 데 문제가 있습니다.주어진 시간의 NSDate 객체를 같은 시간과 현재 날짜로 변환하는 가장 효율적인 방법

현재 NSDateFormatter를 사용하여 시작 및 종료 시간을 문자열로 변환 한 다음 현재 날짜와 현재 날짜가 같은 날짜로 다시 변환합니다. 그런 다음 - (NSComparisonResult) 비교를 사용하여 내 날짜 비교를 수행 할 수 있습니다. 시작 날짜와 종료 날짜를 현재 날짜와 비교합니다. 그러나, 나는 이것을 매우 비효율적이라고 생각할 수 있습니다.

다른 가능한 방법은 각 NSDate를 NSDateComponents로 변환 한 다음 NSCalendar를 사용하여 해당 날짜를 현재 날짜와 동일한 원래 시간으로 NSDate로 변환하는 것입니다.

아니면 다른 접근 방식을 취해서 NSDate 저장 기술을 모두 사용할 수 있습니다. 대신 NSDateComponents로 각 시작 및 종료 시간을 저장할 수 있습니다. 그러면 UITableView에 대한 시간의 형식화 된 버전을 출력하기에 충분히 간단 할 것입니다. 그런 다음 [NSDate date]에 의해 얻은 날짜를 NSDateComponents로 변환하여 논리에 사용할 수 있습니다. 비교를 통해 현재 기간을 얻습니다.

세 가지 또는 네 가지 다른 방법이 있습니다. 실제로 말한 후에 실제로 다른 유형 간의 런타임 변환이 가장 적게 필요하므로 가장 효과적이라고 생각합니다. 날짜 개체. 나는 다른 사람들의 의견을 찾고있는 중이다.

답변

1

NSDate를 사용하여 시간을 저장하는 문제는 해당 값이 시간대에 따라 달라진다는 것입니다. 앱이 전경 또는 배경에서 실행되는 동안 시간대 또는 DST가 변경되면 모든 시간이 갑자기 잘못됩니다. 실제로 디스크에 NSDate 값을 저장하는 경우에도 마찬가지입니다. (한 가지 옵션은 앱의 기본 시간대를 UTC로 설정하는 것이지만 앱의 '지금'이라는 생각은 사용자에게 맞지 않습니다.)

시간을 별도로 저장하고 NSDate와 변환하는 방법을 구현할 것입니다.NSDateComponents를 사용하여 시간을 저장할 수도 있고, 두 번 비교하는 것이 사소한 단일 정수 (자정 이후 분)로 저장할 수도 있습니다.

NSDate와 분을 변환 할 때 NSDateComponents를 사용하고 UIDatePickers, NSCalendars 및 NSDateFormatters가 기본적으로 로컬 시간대 인 동일한 시간대를 사용하는지 확인해야합니다.

0

NSDateFormatter가 현재 프로그램에 대해 부과하는 오버 헤드가 기간 및 현재 날짜를 동기화하도록 걱정하는 것 같습니다. 그러나 정말로, 당신은 전혀 날짜에 신경 쓰지 않습니다, 당신은 단지 하루가 시작된 이래로 시간을 원합니다.

왜 중매인을 제외하지 않습니까? 시작과 끝 시간을 NSTimeIntervals로 저장하십시오. NSTimeIntervals는 실제로는 두 배가됩니다. 새로운 하루가 시작된 후 시간을 초 단위로 단순화하기 위해 시작 시간과 종료 시간을 하루에 초 86,400으로 수정하십시오.

그런 다음 현재 NSDate를 당길 때마다 NSTimeInterval을 86,400 초 수정하여 시간을 초 단위로 얻은 다음 저장된 값과 비교합니다 기간 값 전체 프로세스에 관련된 유일한 오브젝트 변환은 원시 timeIntervalSinceReferenceDate를 사용하는 것입니다. 나머지는 간단한 mod 및 비교 연산자이며 간단한 NSTimeIntervals로 기간 수를 저장합니다.

+0

이것은 일반적으로 간과 된 변환을 포함하고 있습니다. 수정 된 timeIntervalSinceReferenceDate를 현재 시간대를 반영하는 것으로 변환합니다. timeIntervalSinceReferenceDate는 2001 년 1 월 1 일 자정 (GMT)부터 자정 이후 초를 반환하기 때문에 시간 간격을 변경하면 자정 이후 실제 시간 간격에서 18000 또는 5 시간이되는 숫자가됩니다. 따라서, 자정 이래로 초 수를 얻고 싶을 때마다 NSCalendar 객체를 생성해야 할 수도 있습니다. – ecbtln

+0

자정 이후로 몇 초 동안 필요하지 않습니다. 예를 들어, 오전 9시 30 분이 자정 이후로 항상 동일한 초 수가되는 것은 아닙니다. NSCalendar가 필요할 경우 오전 9시 30 분에 도착해야합니다. – gnasher729