iPhone - 考虑夏令时的当前日期

时间:2011-07-28 22:52:55

标签: iphone

我的国家/地区位于GMT + 0。我们现在是+1小时,因为我们正在夏令时。

当我这样做时

[NSDate date];

它应该返回当前的日期和时间,但是当我这样做时,我收到GMT时间而不考虑夏令时。

这是文档对date命令的说法

创建并返回设置为当前日期和时间的新日期。

为什么Apple会对我们这样做?为什么一切都如此复杂?这是一个错误吗?有没有办法获得设备当前的实时时间?同一时间显示在设备的时钟上?

我的应用程序取决于日期和时间,并且位于世界各地的用户位于夏季或冬季的日期错误将是一场灾难。

感谢。


修改

经过多次回答后,我尝试了这段代码:

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];

猜猜怎么样,今天=错今天...... 换句话说,没有变化,我继续错误的日期没有夏令时。 更令人惊奇的是,currentTime在NSString中显示了夏令时的日期...

任何线索?再次感谢。

4 个答案:

答案 0 :(得分:8)

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

无论您是在伦敦,洛杉矶还是新加坡,此值都是 INDEPENDENT 。它与您的县是否尊重夏令时无关。

根据可识别的东西(如“7月28日下午4:28”)来 INTERPRET NSDate,你需要一个NSDateFormatter。您还需要确保正确定义了您的语言环境:包括时区,是否遵守夏令时以及各种时间/日期格式约定。

'希望有所帮助..

答案 1 :(得分:4)

硬编码:

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

当前日期现在是夏令时。

希望帮助。

答案 2 :(得分: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);
}

答案 3 :(得分:2)

网站上有几个好的答案herehere以及hereNSDate是自(UTC)参考日期以来的间隔,但您可以使用NSTimeZone详细说明这些答案。