【问题标题】:Convert an NSDate to a Unix timestamp using a particular time zone使用特定时区将 NSDate 转换为 Unix 时间戳
【发布时间】:2012-06-10 04:24:42
【问题描述】:

我正在尝试使用特定时区(不一定与系统时区相同)获取 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 是澳大利亚/墨尔本的时间。

这可能是什么问题?

【问题讨论】:

    标签: ios cocoa-touch time timezone nsdate


    【解决方案1】:
    time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
    

    【讨论】:

      【解决方案2】:

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

      如果您想获得自 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;
      

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


      编辑:见下方 Ayush 的评论。看起来偏移量的目的是添加,而不是减去。

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

      【讨论】:

      • 谢谢,它的 plus 偏移量。但是,我仍然无法理解为什么这仍然给了我 GMT 时间: NSDate *curdate = [dateFormatter dateFromString:timeStamp];
      • 好吧,首先解释一下……你明白你有几行代码实际上什么都不做,对吧?我不确定您是否可以将它们放在那里以启用某些日志记录?但是,您分配 timeStampcurdate 的两行正在将日期转换为字符串,返回日期。你可以很容易地说curdate = [NSDate date];。所以,这是首先要理解的。
      • 接下来,您需要了解NSDate 只是一个日期。在将其转换为字符串或整数之前,它不一定与任何时区相关联。如果您使用 timeIntervalSince1970,正如我所说,根据 Apple 文档,该整数值始终以 GMT 表示。如果您将curdate 转换为字符串,则可以选择将其打印出来,以墨尔本时间显示时区。但是,在您发布的代码中,您没有这样做。我只看到您将curDate 转换为int,而不是NSString。因此,您并没有真正使用插入日期格式化程序的时区。
      • @Ayush,如果您想将curdate 显示为字符串,在墨尔本时区,只需再添加一行:[dateFormatter stringFromDate: curdate];。当我运行它时(现在回到我的 Mac 上),我得到 2012-06-06 17:46:42,我认为现在墨尔本时间是正确的。
      • @Ayush, A NSDateFormatter 与时区相关联。但是,不是NSDate。您使用日期格式化程序读取像“2012-06-06 17:46:42”这样的字符串,并生成NSDate。因为您已经在格式化程序上设置了时区,所以它知道 17:46:42 必须是墨尔本时间。但是,在将字符串转换为日期后,curdate 对象不再与墨尔本关联。 curdate 只是“现在”。 “现在”对于墨尔本的某个人和我(在美国)来说是一样的。因此,在您将字符串转换回 curdate 后,它不再是墨尔本时间,本身
      猜你喜欢
      • 2012-06-10
      • 2021-12-18
      • 2014-04-28
      • 2013-05-20
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2012-03-19
      相关资源
      最近更新 更多