【问题标题】:Handling Day light time difference处理日光时差
【发布时间】:2013-11-08 03:21:27
【问题描述】:

根据我们的应用程序规范,我们需要安排电话会议,而我在安排时遇到了日光时差的问题。

情况就是这样:美国夏令时在今年 11 月 3 日发生变化,当时我安排了一个电话,例如:11 月 4 日下午 5 点,那时我正在转换为 GMT 并发送到服务器。如果我将格林威治标准时间转换为 11 月 4 日下午 4 点,而不是下午 5 点。尽管它只是正确的,但是从用户的角度来看,他安排在下午 5 点而不是下午 4 点,那么如何处理这种情况。

我正在转换成格林威治标准时间...

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

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

【问题讨论】:

  • 服务器应接受并以 UTC 格式保存日期。当您的应用从服务器获取日期(UTC 格式)时,您可以将其转换为您的本地时区。
  • 这里最可能的情况是您输入的日期不正确。请提供用于生成该代码的代码。 :)
  • @StevenFisher 请检查编辑。
  • strt_date_locconvert_to_gmt_time 的参数吗?
  • @StevenFisher 不,它已经从 gmt 转换为本地,strt_date_local 我曾经使用格式化程序来形成字符串,在 11 月 3 日之前它给出了正确的值,但是在它创建字符串之后不到 1 小时应该是。

标签: ios objective-c nsdate dst nsdatecomponents


【解决方案1】:

一次又一次,然后……:您无法将日期转换为时区。您可以将日期表示转换为时区。这不会更改日期。不要试图比日期更棘手。

Unexpected value from NSDate

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

在回来的路上读取这个日期(不是它的一个表示)并使用本地格式化程序构建一个本地表示。

从不将日期的任何本地表示形式发送到任何地方。 GMT 是本地代表。 (G代表什么?)

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

    有问题,

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多