3

我正在尝试使用特定时区(不一定与系统时区相同)获取 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,它仍然是格林威治标准时间,timeStamp是澳大利亚/墨尔本的时间。

这里可能是什么问题?

4

2 回答 2

6

该方法返回自GMT 时间timeIntervalSince19701970 年 1 月 1 日午夜以来的秒数。

如果您想要自 1970 年 1 月 1 日墨尔本时间午夜以来的秒数,您只需要确定 1970 年 1 月 1 日墨尔本格林威治标准时间的偏移量。

为此,您可以使用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 以外的任何其他时区跟踪这样的时间戳。当需要向用户显示时间时转换为时区。

于 2012-06-06T07:20:06.563 回答
2
time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
于 2012-06-06T08:50:38.210 回答