2011-07-28 9 views
7

거주 국가 내 기타 국가는 GMT + 0입니다. 우리는 일광 절약 시간에 있기 때문에 지금 +1 시간입니다.iPhone - 현재 일광 절약 시간제

내가 할 때

[NSDate date]; 

가 현재 날짜와 시간을 반환하는데,하지만 난 그렇게 할 때, 나는 GMT 시간이 일광 절약을 고려하지 받게되었다.

이것은 문서가

작성해 현재 날짜와 시간을 설정 새로운 날짜를 반환 date 명령에 대해 말할 것입니다.

왜 애플이 그렇게합니까? 왜 모든 것이 그렇게 복잡합니까? 이거 버그 야? 기기가 켜져있는 현재 실시간을 가져 오는 방법이 있습니까? 기기의 시계에 표시되는 시간과 동일합니까?

내 앱은 날짜와 시간에 따라 다르며 전 세계 다른 시간대 (예 : 여름 또는 겨울)에있는 사용자가 잘못된 날짜를 사용하면 재앙이 발생합니다.

감사합니다.

NSDate *wrongToday = [NSDate date]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; 

[dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
NSString *currentTime = [dateFormatter wrongToday]; 

NSDate *today = [dateFormatter dateFromString:currentTime]; 

는 오늘 = wrongToday ... 즉 가, 변화, 내가 가진 무엇을 계속 추측한다 : 몇 가지 답변 후, 나는이 코드를 시도 EDIT


일광 절약 시간제가 잘못된 날짜입니다. 더 놀라운 것은 currentTime이 NSString에서 일광 절약 시간제를 사용하여 날짜를 표시한다는 것입니다 ...

모든 단서가 있습니까? 다시 한 번 감사드립니다.

+2

NSDate 개체는 절대 시간을 나타냅니다. 일광 절약 시간제 또는 시간대에 의해 영향을받지 않습니다. 특정 시간대의 날짜를 출력하려면 NSDateFormatter의 인스턴스를 만들어야합니다. – albertamg

+1

미안하지만, Apple docs는 [NSDate date]가 현재 날짜와 시간을 반환한다고 말합니다. 이것은 사실이 아닙니다. 현재 날짜와 시간은 일광 절약 시간을 고려해야합니다. – SpaceDog

+2

표준 시간대 및 일광 절약 시간제는 현지화 문제입니다. 문서는 GMT를 여러 곳에서 언급하지만 분명히 명확해질 수 있습니다. – MRAB

답변

2

사이트에는 이미 hereherehere이라는 두 가지 좋은 답변이 있습니다. NSDate은 (UTC) 기준일 이후의 간격이지만 해당 답변에 자세한 내용으로 NSTimeZone을 사용할 수 있습니다.

+0

일부 코드를 포함하도록 질문을 편집했습니다 ... 읽어보십시오. – SpaceDog

8

albertamg, MRAB 및 Joe Osborn 모두 정확합니다. 그들은 모두 NSDate가 "숫자", "절대적 순간"이라고 설명하려고합니다.

런던, 로스 앤젤레스 또는 싱가포르에 상관없이이 값은 INDEPENDENT입니다. 카운티가 일광 절약 시간제를 존중하는지 여부는 독립적입니다.

INTERPRET NSDate (예 : "7 월 28 일 오후 4시 28 분")와 같이 NSDateFormatter가 필요합니다. 또한 시간대, 일광 절약 시간 적용 여부 및 다양한 시간/날짜 형식 규칙을 포함하여 로캘이 올바르게 정의되었는지 확인해야합니다.

하는 데 도움이

'희망 ..

+0

몇 가지 코드를 포함하도록 질문을 수정했습니다 ... 읽어보십시오. – SpaceDog

4

하드 코딩 :

BOOL isDayLightSavingTime = [sysTimezone isDaylightSavingTimeForDate:currentDate]; 
if (isDayLightSavingTime) { 
    NSTimeInterval timeInterval = [sysTimezone daylightSavingTimeOffsetForDate:currentDate]; 
    currentDate = [currentDate dateByAddingTimeInterval:timeInterval]; 
} 

현재 날짜는 현재 일광 절약되는 시간입니다.

희망 도움말.

3

내 제안!

NSString *dateToTest = @"16-10-2016"; // <-- daylight saving 
NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; 

[dateformatter setDateFormat:@"dd-MM-yyyy"]; 

NSDate *data = [dateformatter dateFromString:dateToTest]; 

NSLog(@"data before --> %@:", data); 


if (data == nil && [[NSTimeZone systemTimeZone] isDaylightSavingTimeForDate:data]) { 

    NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:[NSTimeZone localTimeZone].name]; 

    [dateformatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:[timeZone secondsFromGMT]]]; 

    data = [dateformatter dateFromString:dateToTest]; 

    NSLog(@"data after --> %@:", data); 
} 
관련 문제