在约会上获得一小时的差异

时间:2016-01-15 09:06:49

标签: ios iphone nsdate nsdateformatter nstimezone

以下是我写的将 UTC 时间转换为本地时间的代码:

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
    [dateFormatter1 setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    [dateFormatter1 setLocale:locale];
    NSDate *date = [dateFormatter1 dateFromString:dateString];

    dateString = [date descriptionWithLocale:[NSLocale systemLocale]];

    NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone];
    NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];

    NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:date];
    NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date];
    NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset;

    NSDate *destinationDate = [[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:date];

    NSDateFormatter *dateFormatters = [[NSDateFormatter alloc] init];
    [dateFormatters setDateFormat:@"HH:mm"];
    [dateFormatters setTimeZone:[NSTimeZone systemTimeZone]];
    dateString = [dateFormatters stringFromDate: destinationDate];  

但是这样我得到了 1小时的差异。即如果网络应用程序上显示的日期是12:30,则在应用程序上显示为13:30。为什么会这样?

2 个答案:

答案 0 :(得分:0)

尝试使用此代码:

- (NSDate *) UTCTimeToLocalTime
{
    NSTimeZone *tz = [NSTimeZone defaultTimeZone];
    NSInteger seconds = [tz secondsFromGMTForDate: yourDate];
    return [NSDate dateWithTimeInterval: seconds sinceDate: yourDate];
}

- (NSDate *) LocalTimeToUTCTime
{
    NSTimeZone *tz = [NSTimeZone defaultTimeZone];
    NSInteger seconds = -[tz secondsFromGMTForDate: yourDate];
    return [NSDate dateWithTimeInterval: seconds sinceDate: yourDate];
}

答案 1 :(得分:-1)

您需要学习并接受处理时间和日期的原则。

NSDate代表时间点,与任何时区无关。如果我们正在通电话,而我们的电脑计算[NSDate日期],即使我们的手表显示完全不同的时间,它们也会得到完全相同的日期。

带有时区信息的日历在NSDate和世界某个特定部分的用户期望的内容之间进行转换。因此,相同的NSDate将转换为字符串以匹配您的手表显示的内容,或者我的手表显示的内容,这将是不同的。就像你一样,不应该在任何一个中修改NSDate。