NSDate表示在不同的时区,即本地时区(GMT-400)到PST

rss*_*tmr 3 iphone formatting timezone date nsdate

我知道如何使用NSTimeZone来获取另一个时区中当前时间的偏移量.NSDate总是相对于GMT返回,那么如何使用正确的时区信息派生字符串?也就是说,我将当前时间(在美国东部时间)中使用,并使用NSTimeZone最后减去表示PST时间所需的3小时.但我所做的就是从相对于我的时区仍然代表的时间减去3个小时.如何让NSDateFormatter使用目标时区吐出时间?

我试过的一个方法是:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; // for PST
NSDateComponents *dc = [cal components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:now];
[cal setTimeZone:tz];
NSDate *newDate = [cal dateFromComponents:dc];
Run Code Online (Sandbox Code Playgroud)

没爱.我可以采用单独的日期组件并组成一个字符串,但它不可本地化.

一个相关的问题:

NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; // for PST
NSString *abbreviation = [tz abbreviation];
NSString *name = [tz name];
Run Code Online (Sandbox Code Playgroud)

两者abbreviationname最终返回GMT-0800,而不是我期望的PST.如果我愿意的话,我甚至无法做到.我究竟做错了什么?

Ole*_*ann 12

NSDate总是相对于GMT返回

这没有意义.NSDate只是封装了一个绝对的时刻(让我们忘记一秒钟的相对论),它没有任何时区概念.说NSDate时间与GMT相关是错误的.

要在特定时区输出日期,您应该创建一个实例NSDateFormatter并调用setTimeZone:它来设置时区.根据Unicode文档,格式字符串@"zzz"应将时区值输出为"PST".

  • 我进行了一些实验,发现格式字符串`@"zzz"`确实会输出"PDT"(今天的日期).但是,只有为日期格式化程序设置的时区是用名称或缩写创建的,而不仅仅是格林威治标准时间的秒数时,这才有效:`[NSTimeZone timeZoneWithAbbreviation:@"PST"]`.我想这是有道理的,因为系统无法告知您的具体时区.我还必须明确地将日期格式化程序的语言环境设置为en-US. (3认同)
  • 是的,昨天有人向我指出,GMT-05:00可以很容易地代表秘鲁时间或哥伦比亚时间以及东部标准时间.再说一遍,不知道为什么我没有发生这种情况.我从我们的服务器获得的唯一时区信息是从格林尼治标准时间偏移数小时,所以我想我们将不得不放弃好的时区描述.谢谢你的帮助. (2认同)