我正在尝试使用特定时区获取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
是澳大利亚/墨尔本的时间。
这可能是什么问题?
答案 0 :(得分:6)
方法timeIntervalSince1970
返回1970年1月1日午夜以来的秒数<格林威治标准时间的 。
如果您想要自1970年1月1日午夜墨尔本时间以来的秒数,您只需要确定1970年1月1日GMT墨尔本的偏差。
为此,您可以使用your NSTimeZone instance
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之外的任何其他时区,大多数应用程序可能永远不需要跟踪这样的时间戳。在向用户显示时间时转换为时区。
答案 1 :(得分:2)
time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];