Objective-C将NSDate设置为当前UTC


80

是否有一种简单的方法可以初始化NSDate当前的UTC日期/时间?


1
[NSDate date]工作吗?我不确定是否是UTC。
zneak

2
没有NSDate设置为UTC的东西,它没有与之关联的时区。
尼克·福奇

3
@MurraySagal您不正确-NSDate代表时间的瞬间(名称NSDate有点用词不当)。在描述诸如“ 2001年1月1日的第一时刻”之类的时间时,您需要一个时区来计算出您所说的确切时间点,但是一旦NSDate创建了该时间点,就没有与其相关的时区。
Nick Forge

1
@NickForge NSDate被创建为“格林尼治标准时间2001年1月1日的第一个瞬间”,这是在特定时区的特定时间,这一事实是不变的,并且对于日期为何如此起作用至关重要。如果我们在不同的时区并且同时记录了此时间,NSLog(@"since1970= %f", [[NSDate date] timeIntervalSince1970]);则结果是相同的。为什么?因为它与特定时区(GMT)中的特定时间点有关,所以无论用户身在何处。它相对于GMT的事实一旦创建就不会消失。没有这个锚点,日期将是任意的。
Murray Sagal 2013年

2
@MurraySagal两种方式都对,但是尼克说“没有NSDateUTC设置是正确的”更正确,因为您无法设置的时区NSDate,并且说错了它“有一个时区”。确实是对于特定时区定义的,但是说它“有”时区意味着时区是的属性NSDate,而事实并非如此。
devios1 2013年

Answers:


148

[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;
}

2
NSTimeZone * timeZone = [NSTimeZone timeZoneWithName:@“ UTC”]; [dateFormatter setTimeZone:timeZone]; 对此表示感谢
Brodie

1
如果这已经投入生产,那么您可能实际上想创建一个懒惰初始化的静态dateFormatter。创建dateFormatter实际上有点昂贵。
jessecurry 2010年

3
我需要它作为日期对象而不是字符串,在这种情况下我该怎么办?
2013年

1
日期的存在与时区无关,该时区仅用于产生供人类消费的输出。
jessecurry 2013年

@jessecurry不太正确。在NSDate类引用中:“此方法返回相对于绝对引用日期的时间值-GMT 2001年1月1日的第一时刻。” 请注意对GMT的明确而具体的引用。
Murray Sagal

13

NSDate是指从绝对参考日期(格林尼治标准时间2001年1月1日00:00)开始的时间间隔。因此,类方法[NSDate date]将返回该间隔的表示形式。要以UTC文本格式显示该数据,只需将NSDateFormatter与相应的NSTimeZone(UTC)结合使用即可根据需要进行呈现。


3
我相信此答案中的[NSDate now]应该是[NSDate date]。
–foldinglettuce

2

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

迅捷版:

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)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.