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

时间:2012-06-06 06:48:09

标签: ios cocoa-touch time timezone nsdate

我正在尝试使用特定时区获取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是澳大利亚/墨尔本的时间。

这可能是什么问题?

2 个答案:

答案 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];