使用特定时区将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];