使用特定时区将NSDate转换为Unix时间戳

我试图使用特定时区获取Unix时间戳(不一定与系统的时区相同)

我试过这个:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSTimeZone *gmt = [NSTimeZone timeZoneWithName:@"Australia/Melbourne"]; [dateFormatter setTimeZone:gmt]; NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]]; NSDate *curdate = [dateFormatter dateFromString:timeStamp]; int unix_timestamp = [curdate timeIntervalSince1970]; 

显然,这应该给出澳大利亚的Unix时间戳(最多几秒)。 但是,当我记录curdate ,它仍然是GMT的时间, timeStamp是澳大利亚/墨尔本的时间。

这可能是什么问题?

timeIntervalSince1970方法返回自格林威治标准时间 1970年1月1日午夜以来的秒数。

如果你想要自1970年1月1日墨尔本时间午夜以来的秒数,你只需要确定1970年1月1日GMT墨尔本的偏差。

为此,您可以使用NSTimeZone实例

  NSDate* referenceDate = [NSDate dateWithTimeIntervalSince1970: 0]; NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Australia/Melbourne"]; int offset = [timeZone secondsFromGMTForDate: referenceDate]; int melbourneTimestamp = unix_timestamp - offset; 

或者,也许最后一行应该是偏移量。 只需测试代码并查看。 我现在不在我的Mac上。


编辑:请参阅下面的Ayush评论。 看起来偏移量是要添加的 ,而不是减去。

编辑#2:与海报聊天后,墨尔本时间 1970 以来的时间戳可能实际上并不需要。 在GMT之外的任何其他时区,大多数应用程序可能永远不需要跟踪这样的时间戳。 在向用户显示时间时转换为时区。

 time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];