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

Ayu*_*ary 3 time timezone cocoa-touch nsdate ios

我试图使用特定时区获取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];
Run Code Online (Sandbox Code Playgroud)

显然,这应该给出澳大利亚的Unix时间戳(最多几秒).然而,当我登录时curdate,它仍然是格林尼治标准时间的时间,timeStamp是澳大利亚/墨尔本的时间.

这可能是什么问题?

Nat*_*ate 6

该方法timeIntervalSince1970返回自格林威治标准时间 1970年1月1日午夜起的秒数.

如果您想要自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;
Run Code Online (Sandbox Code Playgroud)

或者,也许最后一行应该是偏移量.只需测试代码并查看.我现在不在我的Mac上.


编辑:请参阅下面的Ayush评论.看起来偏移量是要添加的,而不是减去.

编辑#2:与海报聊天后,墨尔本时间 1970 以来的时间戳可能实际上并不需要.在GMT之外的任何其他时区,大多数应用程序可能永远不需要跟踪这样的时间戳.在向用户显示时间时转换为时区.

  • @Ayush,一个`NSDateFormatter`**与时区相关联.但是,**不是**NSDate`.您使用日期格式化程序读取字符串,如"2012-06-06 17:46:42",并生成一个`NSDate`.因为您已经在格式化程序上设置了时区,所以它知道17:46:42必须是墨尔本时间.但是,在将字符串转换为日期之后,`curdate`对象不再与墨尔本相关联.`curdate`就是"现在"."现在"对于墨尔本的人和对我来说都是一样的(在美国).因此,在您将字符串转换回`curdate`后,它不再是墨尔本时间,*本身*. (2认同)