【问题标题】:Objective-C setting NSDate to current UTCObjective-C 将 NSDate 设置为当前 UTC
【发布时间】:2011-02-06 15:12:36
【问题描述】:

有没有一种简单的方法可以使用当前的 UTC 日期/时间来初始化 NSDate

【问题讨论】:

  • [NSDate date] 会起作用吗?我不确定是不是 UTC。
  • 没有设置为 UTC 的 NSDate 这样的东西,它没有与之关联的时区。
  • @MurraySagal 你错了——NSDate 代表一个瞬间(NSDate 这个名字有点用词不当)。在描述诸如“2001 年 1 月 1 日的第一个瞬间”之类的时间时,您需要一个时区来计算出您所谈论的确切时间,但是一旦创建了 NSDate,就没有与之关联的时区它。
  • @NickForge NSDate 被创建为“格林威治标准时间 2001 年 1 月 1 日的第一个瞬间”,即特定时区中的特定时间,这一事实是不可变的,并且对于日期为何起作用至关重要做。如果我们在不同的时区并且我们同时记录了这个,NSLog(@"since1970= %f", [[NSDate date] timeIntervalSince1970]); 结果是一样的。为什么?因为它是相对于特定时区 (GMT) 中的特定时间点而言的,无论用户身在何处。它与 GMT 相关的事实不会在创建后消失。如果没有这个锚,日期将是任意的。
  • @MurraySagal 你在不同的方面都是对的,但尼克说“没有NSDate设置为UTC”更正确,因为你不能设置时区NSDate,你说它“有一个时区”是不正确的。确实,它是相对于特定时区相对定义的,但说它“具有”时区意味着时区是NSDate 的属性,而事实并非如此。

标签: iphone objective-c ios nsdate utc


【解决方案1】:

[NSDate date];

您可能希望创建一个执行以下操作的类别:

-(NSString *)getUTCFormateDate:(NSDate *)localDate
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:localDate];
    [dateFormatter release];
    return dateString;
}

【讨论】:

  • NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; [dateFormatter setTimeZone:timeZone];搞定了,谢谢
  • 如果将其投入生产,您可能实际上想要创建一个静态的 dateFormatter 延迟初始化。创建 dateFormatter 实际上有点昂贵。
  • 我需要它作为日期对象而不是字符串,在这种情况下我该怎么办?
  • 日期独立于时区存在,时区仅用于生产供人类消费的输出。
  • @jessecurry 不太正确。来自 NSDate 类参考:“此方法返回相对于绝对参考日期的时间值——格林威治标准时间 2001 年 1 月 1 日的第一时刻。”请注意对 GMT 的明确和具体引用。
【解决方案2】:

NSDate 是对从绝对参考日期 2001 年 1 月 1 日 00:00 GMT 开始的间隔的引用。因此类方法 [NSDate date] 将返回该间隔的表示。要在 UTC 中以文本格式呈现该数据,只需使用 NSDateFormatter 和适当的 NSTimeZone (UTC) 来根据需要呈现。

【讨论】:

  • 我相信 [NSDate now] 在这个答案中应该是 [NSDate date]。
【解决方案3】:

NSDate 对象封装了一个时间点,独立于任何特定的日历系统或时区。 Date 对象是不可变的,表示相对于绝对参考日期(2001 年 1 月 1 日 00:00:00 UTC)的不变时间间隔。

Swift 版本:

extension NSDate {
    func getUTCFormateDate() -> String {
        let dateFormatter = NSDateFormatter()
        let timeZone = NSTimeZone(name: "UTC")
        dateFormatter.timeZone = timeZone
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return dateFormatter.stringFromDate(self)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多