2011-11-09 5 views
1

저는 미국 동부 표준 시간대 (EST)에 살고 있고, 몇 주 전에 일광 절약이 시작되었습니다. 나는 (아마도) 잘 작동하고 있던 제 이전 코드 중 일부를 테스트하고 있었고 그날의 계산이 1 시간 더 빨리 수행된다는 것을 알았습니다.iPhone4 iOS5 [[NSTimeZone localTimeZone] daylightSavingTimeOffset] 일광 절약 시간제가 잘못 되었나요?

int gmtOffset = [[NSTimeZone localTimeZone] secondsFromGMT]; 
int daylightOffset = [[NSTimeZone localTimeZone] daylightSavingTimeOffset]; 

    int daySeconds = ((int)([date timeIntervalSinceReferenceDate]+gmtOffset+daylightOffset))%(86400+1); 

NSLog(@"Day seconds: %i", daySeconds); 

결과는 예상 값보다 3,600초 작 :

는 여기에 내가 테스트를 위해 사용하는 코드입니다. daylightOffset은 0입니다. 사용자가있는 표준 시간대에 일광 오프셋을 올바르게 가져 오려면 어떻게해야합니까? NSDateFormatter는 날짜를 올바르게 파싱하므로 NSTimeZone이 알려주지 않는 것을 알고 있어야합니다.

감사합니다.

답변

0

자정 이후로 경과 된 시간 (초)을 확인하려면 날짜 구성 요소를 사용할 수 있습니다. 이 코드는 일광 절약 시간제를 적절하게 조정합니다.

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[calendar setTimeZone:[NSTimeZone localTimeZone]]; 

NSDateComponents *comps = [calendar components:NSHourCalendarUnit|NSMinuteCalendarUnit| NSSecondCalendarUnit 
             fromDate:[NSDate date]]; 
NSInteger time = [comps hour] * 3600 + [comps minute] * 60 + [comps second]; 

NSLog(@"Day seconds: %i", time); 
5

[localTime secondsFromGMT] 시간 일광 절약 시간제를 포함한 진정한 GMT를 반환, 당신은이 될 것으로 보인다 [localTime daylightSavingTimeOffset]

1

에 의해 자체를 상쇄받을 수있는 recurringproblemformany (me included)와 당겨 한 후 내 머리 방법 너무 오래 나는 마침내 문제를 해결했다.

  1. 당신이
  2. 당신이 원하지
  3. 당신이 당신의 날짜 계산은 어떤 일광 절약 시간에 잊기로 원하는 시간, 날짜에 관심이 :

    이 코드에 의존 가정

    는 점이다 당신이 그것을 유지할 수있는 날짜와 같은 문자열 표현이 쉽다. 양력으로 초기화 내가 사용하는 독특한 NSCalendar 인스턴스를 1을 실현하려 위해

, GMT 이 또한 NSDateFormatter이 독특한 달력 모두 초기화 3. 2.

를 제공의 시간대. 포맷터의 시간대를 계산에 사용되는 달력의 시간대로 설정하면 내가 가진 모든 문제의 핵심이었습니다!

NSDate * today = [DateModel normalize: [NSDate date]] ; 
NSString*todayS= [DateModel dateToString: today] ; 
BOOL alwaysTrue=[[DateModel normalize: [NSDate date]] isEqual: [DateModel stringToDate: todayS]] ; 

이 여기에 코드입니다 :

이 항상 진실해야합니다 (아래의 코드를 가정은 DateModel 클래스의 일부이다)

+ (NSDate *) normalize: (NSDate *) date { 
    NSDateComponents * comps = [[DateModel calendar] components:NSYearCalendarUnit 
                  | NSMonthCalendarUnit 
                  | NSDayCalendarUnit 
                  | NSHourCalendarUnit 
                  | NSMinuteCalendarUnit 
                  | NSSecondCalendarUnit 
                 fromDate:date] ; 

    [comps setHour:0] ; 
    [comps setMinute:0] ; 
    [comps setSecond:0] ; 

    NSDate * dateOnly = [[DateModel calendar] dateFromComponents:comps] ; 

    return dateOnly ; 
} 

+ (NSCalendar *) calendar { 
    static NSCalendar * calendar = nil ; 
    if (calendar == nil) { 
     calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] ; 
     calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation: @"GMT"] ; 
    } 
    return calendar ; 
} 

+ (NSDateFormatter *) dateFormatter { 
    static NSDateFormatter * formatter = nil ; 
    if (formatter == nil) { 
     formatter = [[NSDateFormatter alloc] init] ; 
     [formatter setCalendar:[self calendar]] ;   // <- This is 
     [formatter setTimeZone:[self calendar].timeZone] ; // <- critical 
     [formatter setDateFormat:@"yyyyMMdd"] ; 
    } 
    return formatter ; 
} 

+ (NSDate *) dateFromString: (NSString *) stringDate { 
    return [DateModel normalize: [[DateModel dateFormatter] dateFromString:stringDate]] ; 
} 

+ (NSString *) stringFromDate: (NSDate *) date { 
    return [[DateModel dateFormatter] stringFromDate:[DateModel normalize: date]] ; 
} 

희망이 누군가를하는 데 도움이!

관련 문제