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

p0l*_*ris 60 objective-c nsdate ios swift

在objective-c中,以下代码使用dateAPI 生成UTC日期时间信息.

NSDate *currentUTCDate = [NSDate date]
Run Code Online (Sandbox Code Playgroud)

然而,在Swift中,

let date = NSDate.date()
Run Code Online (Sandbox Code Playgroud)

导致当地日期和时间.

我有两个问题:

  1. 如何dateNSDate对象中获得UTC时间和本地时间(以及当地时间).
  2. 如何从NSDate对象获得秒数的精度.

编辑1:感谢所有输入,但我不是在寻找NSDateFormatter对象或字符串值.我只是在寻找NSDate对象(但是我们将它们煮熟,但这是要求).
见第1点.

Ste*_*her 63

NSDate没有时区的特定时间点.将其视为自参考日期以来经过的秒数.自特定参考日期以来,一个时区与另一个时区相比过了多少秒?答案是一样的.

根据您输出该日期的方式(包括查看调试器),您可能会在不同的时区获得答案.

如果它们在同一时刻运行,它们的值是相同的.它们都是自参考日期以来的秒数,可以在输出格式化为UTC或本地时间.在日期变量中,它们都是UTC.

Objective-C的:

NSDate *UTCDate = [NSDate date]
Run Code Online (Sandbox Code Playgroud)

迅速:

let UTCDate = NSDate.date()
Run Code Online (Sandbox Code Playgroud)

为了解释这一点,我们可以在游乐场中使用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
Run Code Online (Sandbox Code Playgroud)

日期输出会有所不同,但日期不变.这正是你所说的.没有本地NSDate这样的东西.

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

let seconds = date.timeIntervalSince1970
let microseconds = Int(seconds * 1000) % 1000 // chops off seconds
Run Code Online (Sandbox Code Playgroud)

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


Leo*_*bus 42

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.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "HH:mm:ss.SSS"
        return formatter
    }()
    static let preciseGMTTime: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "HH:mm:ss.SSS"
        return formatter
    }()
}
Run Code Online (Sandbox Code Playgroud)
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) ?? ""
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场测试

Date().preciseLocalTime // "09:13:17.385"  GMT-3
Date().preciseGMTTime   // "12:13:17.386"  GMT
Date().nanosecond       // 386268973
Run Code Online (Sandbox Code Playgroud)

这可能有助于您格式化日期:

在此输入图像描述


Raf*_*fAl 29

文档说,date无论使用何种语言,该方法都会将新日期设置为当前日期和时间.

该问题可能位于您使用日期的地方NSDateFormatter.NSDate只是时间线上的一个点.谈论时没有时区NSDate.我做了一个测试.

迅速

print(NSDate())
Run Code Online (Sandbox Code Playgroud)

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

Objective-C的

NSLog(@"%@", [NSDate date]);
Run Code Online (Sandbox Code Playgroud)

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

结果 - 没有区别.


Dai*_*jan 22

日期与任何时区无关,因此请使用Dateformatter并附加时区进行显示:

迅速:

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

dateFormatter.timeZone = timeZone

println(dateFormatter.stringFromDate(date))
Run Code Online (Sandbox Code Playgroud)

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]);
Run Code Online (Sandbox Code Playgroud)


abh*_*ran 21

let date = Date() 
print(date) // printed date is UTC 
Run Code Online (Sandbox Code Playgroud)

此代码以UTC格式给出日期.如果您需要当地时间,则应使用timezone调用以下扩展名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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Ali*_*Ali 12

目前(对Swift的最新更改)NSDate.date()已不再可用.

相反,您只需要初始化NSDate并获取当前日期和时间.
在游乐场尝试一下:

var d = NSDate()
d
Run Code Online (Sandbox Code Playgroud)

你会得到:

Oct 22, 2014, 12:20 PM"  
Run Code Online (Sandbox Code Playgroud)


Piy*_*ara 7

斯威夫特3

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样打电话:

Date().currentTimeZoneDate()
Run Code Online (Sandbox Code Playgroud)

  • 这将给出当前时区日期。不是 UTC。 (2认同)