从NSDate对象获取UTC时间和本地时间

在objective-c中,以下代码使用date API生成UTCdate时间信息。

 NSDate *currentUTCDate = [NSDate date] 

然而在Swift中,

 let date = NSDate.date() 

导致当地date和时间。

我有两个问题:

  1. 我如何获得UTC时间和本地时间(以及date给出本地时间)在NSDate对象。
  2. 我怎么能从NSDate对象获得秒的精度。

编辑1:感谢所有的投入,但我不是在寻找NSDateFormatter对象或string值。 我只是在寻找NSDate对象(但是我们做了它们,但这是要求)。
见第1点。

该文档说, date方法返回一个新的date设置为当前date和时间,无论使用的语言。

这个问题可能在你使用NSDateFormatter呈现date的地方。 NSDate只是时间线上的一个点。 谈论NSDate时没有时区。 我做了一个testing。

迅速

 print(NSDate()) 

输出: 2014-07-23 17:56:45 +0000

Objective-C的

 NSLog(@"%@", [NSDate date]); 

输出: 2014-07-23 17:58:15 +0000

结果 – 没有区别。

NSDate没有时区的特定时间点。 把它看作自参考date以来经过的秒数。 自一个特定的参考date以来,一个时区与另一个时区相差多less秒? 答案是一样的。

根据您输出date的方式(包括查看debugging器),您可能会在不同的时区得到答案。

如果他们同时运行,这些值是相同的。 它们都是自参考date以来的秒数,可以格式化为UTC或当地时间。 在datevariables中,它们都是UTC。

Objective-C的:

 NSDate *UTCDate = [NSDate date] 

迅速:

 let UTCDate = NSDate.date() 

为了解释这一点,我们可以在操场上使用NSDateFormatter:

 import UIKit let date = NSDate.date() // "Jul 23, 2014, 11:01 AM" <-- looks local without seconds. But: var formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ" let defaultTimeZoneStr = formatter.stringFromDate(date) // "2014-07-23 11:01:35 -0700" <-- same date, local, but with seconds formatter.timeZone = NSTimeZone(abbreviation: "UTC") let utcTimeZoneStr = formatter.stringFromDate(date) // "2014-07-23 18:01:41 +0000" <-- same date, now in UTC 

date输出有所不同,但是date不变。 这正是你所说的。 有没有这样的事情当地的NSDate。

至于如何得到微秒,你可以使用这个(把它放在同一个操场的底部):

 let seconds = date.timeIntervalSince1970 let microseconds = Int(seconds * 1000) % 1000 // chops off seconds 

要比较两个date,可以使用date.compare(otherDate)

Xcode 9•Swift 4 (也适用于Swift 3.x)

 extension Formatter { // create static date formatters for your date representations static let preciseLocalTime: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "HH:mm:ss.SSS" return formatter }() static let preciseGMTTime: DateFormatter = { let formatter = DateFormatter() formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.dateFormat = "HH:mm:ss.SSS" return formatter }() } 

 extension Date { // you can create a read-only computed property to return just the nanoseconds from your date time var nanosecond: Int { return Calendar.current.component(.nanosecond, from: self) } // the same for your local time var preciseLocalTime: String { return Formatter.preciseLocalTime.string(for: self) ?? "" } // or GMT time var preciseGMTTime: String { return Formatter.preciseGMTTime.string(for: self) ?? "" } } 

游乐场testing

 Date().preciseLocalTime // "09:13:17.385" GMT-3 Date().preciseGMTTime // "12:13:17.386" GMT Date().nanosecond // 386268973 

这可能会帮助您也格式化您的date:

在这里输入图像描述

一个date是独立于任何时区,所以使用Dateformatter并附加一个时区来显示:

迅速:

 let date = NSDate() let dateFormatter = NSDateFormatter() let timeZone = NSTimeZone(name: "UTC") dateFormatter.timeZone = timeZone println(dateFormatter.stringFromDate(date)) 

objC:

 NSDate *date = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; [dateFormatter setTimeZone:timeZone]; NSLog(@"%@", [dateFormatter stringFromDate:date]); 

目前(对Swift进行了最新更改), NSDate.date()不再可用。

相反,您只需要初始化NSDate并获取当前的date和时间。
试试看,在一个操场上:

 var d = NSDate() d 

你会得到:

 Oct 22, 2014, 12:20 PM" 

Xcode 9•Swift 4或Swift 3

 let date = Date() // default is UTC. 

此代码以UTC为单位给出date。 如果您需要本地时间,您应该使用Timezone.current调用以下扩展名

  extension Date { var currentUTCTimeZoneDate: String { let formatter = DateFormatter() formatter.timeZone = TimeZone(identifier: "UTC") formatter.amSymbol = "AM" formatter.pmSymbol = "PM" formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" return formatter.string(from: self) } } 

对于UTC时间,请使用它: Date().currentUTCTimeZoneDate

Swift 3

您可以根据UTC的当前时区获取date

 extension Date { func currentTimeZoneDate() -> String { let dtf = DateFormatter() dtf.timeZone = TimeZone.current dtf.dateFormat = "yyyy-MM-dd HH:mm:ss" return dtf.string(from: self) } } 

这样的电话:

 Date().currentTimeZoneDate() 

我的Xcode版本6.1.1(6A2008a)

在操场上,像这样testing:

 // I'm in East Timezone 8 let x = NSDate() //Output:"Dec 29, 2014, 11:37 AM" let y = NSDate.init() //Output:"Dec 29, 2014, 11:37 AM" println(x) //Output:"2014-12-29 03:37:24 +0000" // seconds since 2001 x.hash //Output:441,517,044 x.hashValue //Output:441,517,044 x.timeIntervalSinceReferenceDate //Output:441,517,044.875367 // seconds since 1970 x.timeIntervalSince1970 //Output:1,419,824,244.87537