处理日光时差

时间:2013-10-29 05:23:45

标签: ios objective-c nsdate dst nsdatecomponents

根据我们的应用规范,我们需要安排会议呼叫,而我安排我一直面临着日间时差的问题。

情况就是这样:今年11月3日美国白天的时间有所变化,当时我安排了一个电话,例如:11月4日5点,那时我正在转换成GMT并发送到服务器。如果我将GMT时间转换为11月4日下午4点,而不是5点钟。虽然它只是正确的,但是根据用户的观点,他安排了5 P.M而不是4 P.M,所以如何处理这种情况。

我正在转换成GMT,就像......

- (NSDateComponents*) convert_to_gmt_time : (NSDate*) date
{
    NSDate *localDate = date;
    NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT];
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

    NSDateComponents *date_comp = [[NSCalendar currentCalendar] components: NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:gmtDate];

    return date_comp;
}

修改

这就是我将GMT时间转换为本地的方式......

  NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MMM dd, yyyy"];
NSDate *strt_date_loc = [gregorian dateFromComponents:start_date]; // start_date i'm filling after received from server as GMT.

    // Get date string.
    NSString *strt_date = [dateFormatter stringFromDate: strt_date_loc];

非常感谢任何帮助。感谢名单。

3 个答案:

答案 0 :(得分:1)

一次又一次地......:您无法将日期转换为时区。您可以将日期的表示转换为时区。这不会改变日期。不要试图比日期更棘手。

Unexpected value from NSDate

如果您有本地格式的日期表示(即美国),只需使用本地日期格式化程序从中构建日期。然后将此日期发送到$ anywhere。

在返回途中阅读此日期(不是其中一个表示)并使用本地格式化程序构建本地表示。

永远不要将任何本地的日期表示发送到任何地方。 GMT是当地的代表。 (G代表什么?)

答案 1 :(得分:1)

NSDate是绝对时间,而不是基于时区。所以基本上就像存储GMT所述的时间一样。

所以你只需要获得一个时区为GMT的日历,然后获取组件。

 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
 [calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

 NSDateComponents *date_comp = [calendar components: NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:gmtDate];

答案 2 :(得分:0)

遇到问题,

GMT转换存在问题,因为我确实考虑了GMT的当前时差,而不是在转换日期生效的时差。

这是我修复的方法......

NSCalendar *cal = [NSCalendar currentCalendar];
[cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDateComponents *date_comp = [cal components: NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:localDate];