首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从NSDate对象获取协调世界时和本地时间

从NSDate对象获取协调世界时和本地时间
EN

Stack Overflow用户
提问于 2014-07-24 01:51:11
回答 9查看 148.4K关注 0票数 68

在objective-c中,以下代码使用date应用编程接口生成UTC日期时间信息。

代码语言:javascript
复制
NSDate *currentUTCDate = [NSDate date]

然而,在Swift中,

代码语言:javascript
复制
let date = NSDate.date()

结果为本地日期和时间。

我有两个问题:

  1. 如何获取NSDate对象中的UTC时间和本地时间( date提供本地时间)。
  2. 如何从NSDate对象获取秒的精度。

编辑1:感谢您的所有输入,但我并不是在寻找NSDateFormatter对象或字符串值。我只是在寻找NSDate对象(无论我们如何烹调它们,但这是必需的)。

请参见第1点。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-07-24 02:01:57

文档指出,无论使用哪种语言,date方法都会返回设置为当前日期和时间的新日期。

问题可能出在使用NSDateFormatter表示日期的某个地方。NSDate只是时间线上的一个点。在谈论NSDate时,没有时区。我做了个测试。

斯威夫特

代码语言:javascript
复制
print(NSDate())

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

Objective-C

代码语言:javascript
复制
NSLog(@"%@", [NSDate date]);

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

Result -无差异。

票数 29
EN

Stack Overflow用户

发布于 2014-07-24 02:06:27

NSDate是不带时区的特定时间点。可以将其视为自参考日期以来经过的秒数。从一个特定的参考日期开始,一个时区与另一个时区相比过去了多少秒?答案是相同的。

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

如果它们同时运行,则它们的值是相同的。它们都是自参考日期以来的秒数,其格式可能是将输出为协调世界时或本地时间。在date变量中,它们都是UTC。

Objective-C:

代码语言:javascript
复制
NSDate *UTCDate = [NSDate date]

Swift:

代码语言:javascript
复制
let UTCDate = NSDate.date()

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

代码语言:javascript
复制
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

日期输出会有所不同,但日期是恒定的。这就是你想说的。没有本地NSDate这回事。

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

代码语言:javascript
复制
let seconds = date.timeIntervalSince1970
let microseconds = Int(seconds * 1000) % 1000 // chops off seconds

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

票数 68
EN

Stack Overflow用户

发布于 2014-12-29 12:46:22

Xcode9·Swift 4 (也适用于Swift 3.x)

代码语言:javascript
复制
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
    }()
}

代码语言:javascript
复制
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) ?? ""
    }
}

游乐场测试

代码语言:javascript
复制
Date().preciseLocalTime // "09:13:17.385"  GMT-3
Date().preciseGMTTime   // "12:13:17.386"  GMT
Date().nanosecond       // 386268973

这可能还会帮助你格式化日期:

票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24917483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档