首页 文章

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

提问于
浏览
53

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

NSDate *currentUTCDate = [NSDate date]

然而,在Swift中,

let date = NSDate.date()

导致当地日期和时间 .

我有两个问题:

  • 如何在 NSDate 对象中获取UTC时间和当地时间(以及 date 给出当地时间) .

  • 如何从 NSDate 对象获得秒的精度 .

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

9 回答

  • 38

    文档说 date 方法返回一个新的日期设置为当前日期和时间,无论使用何种语言 .

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

    斯威夫特

    print(NSDate())
    

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

    Objective-C

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

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

    结果 - No difference.

  • 59

    NSDate 是特定时间点 without a time zone . 将其视为自参考日期以来经过的秒数 . 自特定参考日期以来,一个时区与另一个时区相比过了多少秒? The answer is the same.

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

    如果它们在同一时刻运行,它们的值是相同的 . 它们都是自参考日期以来的秒数,其格式为 on output 格式为UTC或当地时间 . 在日期变量中,它们都是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
    

    日期输出会有所不同,但日期不变 . 这正是你所知道的本地NSDate之类的东西 .

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

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

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

  • 4

    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
        }()
    }
    

    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) ?? ""
        }
    }
    

    游乐场测试

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

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

    enter image description here

  • 27

    日期与任何时区无关,因此请使用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]);
    
  • 21
    let date = Date() // default is UTC.
    

    此代码以UTC格式给出日期 . 如果您需要当地时间,则应使用时区调用以下扩展名为 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

  • 16

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

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

    var d = NSDate()
    d
    

    你会得到:

    Oct 22, 2014, 12:20 PM"
    
  • 7

    Swift 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)
        }
    }
    

    像这样打电话:

    Date().currentTimeZoneDate()
    
  • 12

    我的Xcode版本6.1.1(6A2008a)

    在操场上,测试如下:

    // 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
    
  • 1

    我找到了一种在Swift4中获取UTC的简便方法 . 把这段代码放在操场上

    let date = Date() 
    *//"Mar 15, 2018 at 4:01 PM"*
    
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    
    let newDate = dateFormatter.string(from: date) 
    *//"2018-03-15 21:05:04 +0000"*
    

相关问题