2011-07-28 29 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 ... 换句话说,没有任何变化,我继续有没有夏令时的错误日期。 更令人惊讶的是,CurrentTime在NSString中显示日光节约的日期...

任何线索?再次感谢。

+2

NSDate对象表示绝对时刻。它们不受夏令时或时区的影响。要在特定时区输出日期,您应该创建一个NSDateFormatter的实例。 – albertamg

+1

对不起,但Apple文档说[NSDate date]返回当前的日期和时间,这是不正确的。当前日期和时间必须考虑夏令时。 – SpaceDog

+2

时区和夏令时是本地化问题。文件提到格林尼治标准时间在许多地方,但他们当然可以更清楚。 – MRAB

回答

2

在网站上有几个很好的答案已经hereherehereNSDate是自(UTC)参考日期以来的时间间隔,但您可以在这些答案中详细使用NSTimeZone

+0

我编辑了这个问题,包括一些代码...请阅读它。 – SpaceDog

8

albertamg,MRAB和Joe Osborn都是正确的。他们都试图向你解释NSDate是一个“数字”,“绝对时刻”。

此值为独立无论您是在伦敦,洛杉矶还是在新加坡。这与您的县是否尊重夏令时无关。你需要一个NSDateFormatter。你需要一个NSDateFormatter。你需要一个可识别的东西(比如“Th 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); 
}