我正在尝试使用特定时区(不一定与系统相同的时区)获取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];