【问题标题】:NSDate change time zoneNSDate 更改时区
【发布时间】:2013-08-10 02:04:56
【问题描述】:

我正在编写一个涉及时区的应用程序。我想获取用户的设备时间,我们称之为dateA,我有一个目标日期,它始终处于美国东部时间时区(dateB)。

我想获取两个日期之间的差异并向用户显示,但在dateB 的时区。

例如:
用户设备时间是太平洋夏令时间上午 7:30,dateB 是美国东部夏令时间上午 11:00。
所以时差是 30 分钟。

我的算法是:
1) 获取用户设备时间
2) 转换为 EDT
3)获取dateAdateB之间的时间差

我的问题是,在我获得用户的设备时间[NSDate date] 后,使用时区 EDT 通过DateFormatter。时间不变。

编辑::

    NSDate *localDate = [NSDate date]; //this will have 7:30AM PDT
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"EDT"]];
    NSString *convertedTimeString = [dateFormatter stringFromDate:localDate];

convertedTimeString 为什么不包含 EDT 中的 10:30AM? 我做错了什么?

【问题讨论】:

  • 日期没有时区,所以如果你用合适的时区形成日期,不用太多转换就可以计算出差异。

标签: ios timezone nsdate


【解决方案1】:

NSDate 以时区中立的方式存储。使用-[NSDateFormatter setTimeZone:] 实际格式化给定时区取决于NSDateFormatter。如果您想要来自NSDate 的字符串,还有-[NSDate descriptionWithCalendarFormat:timeZone:locale:],但通常最好使用NSDateFormatter

【讨论】:

  • 我看到了一个链接stackoverflow.com/questions/13917938/…。它将 [NSDate date] 转换为 GMT,然后将我的 dateB 也转换为 GMT,然后计算时差。这是一个可接受的解决方案还是有更好的方法来做到这一点?
  • 是的,这已经是解决方案,但它不会将日期转换为 GMT,它会将字符串解释为 GMT 时区的时间。接受该答案,然后将GMT 替换为PDT(这是您的源时区)。现在您有了一个日期对象,并且该日期对象没有绑定到时区(理解这一点很重要:NSDate 是时区中立的)。如果要存储或传输日期,这就是您要存储或传输的内容。 然后为了显示,你再次将它提供给 NSDateFormatter,这次你设置目标时区并将日期转换为字符串。
猜你喜欢
  • 2014-04-22
  • 2015-03-26
  • 2013-03-18
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2023-03-08
  • 2018-12-16
  • 2011-07-09
相关资源
最近更新 更多