使用特定时区将 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时,它仍然是格林威治标准时间,timeStamp是澳大利亚/墨尔本的时间。

这里可能有什么问题?

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

如果您想要自 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];

相关内容

  • 没有找到相关文章

最新更新