Получить время UTC и местное время из nsdate объекта


в objective-c следующий код приводит к информации о времени даты UTC с помощью date API.

NSDate *currentUTCDate = [NSDate date]

в Swift однако,

let date = NSDate.date()

результаты в местной дате и времени.

у меня есть два вопроса:

  1. как я могу получить время UTC и местное время (ну date дает местное время) в NSDate объекты.
  2. как я могу получить точность в течение нескольких секунд от
9 51

9 ответов:

в документации сказано, что date метод возвращает новую дату, установленную на текущую дату и время, независимо от используемого языка.

проблема, вероятно, сидит где-то, где вы представляете дату с помощью NSDateFormatter. NSDate это просто точка на временной линии. Нет часовых поясов, когда речь идет о NSDate. Я сделал тест.

Свифт

print(NSDate())

выход: 2014-07-23 17:56:45 +0000

С

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

выход: 2014-07-23 17:58:15 +0000

результат - никакой разницы.

NSDate это определенный момент времени без часового пояса. Подумайте об этом как о количестве секунд, прошедших с контрольной даты. Сколько секунд прошло в одном часовом поясе, и еще с определенной даты отсчета? ответ тот же.

в зависимости от того, как вы выход эта дата (включая просмотр отладчика), вы можете получить ответ в другом часовом поясе.

если они бежали в то же время момент, значения этих же самых. Они оба - это количество секунд с даты ссылки, которое может быть отформатировано на выходе по UTC или местному времени. В переменной даты они оба UTC.

Цель-C:

NSDate *UTCDate = [NSDate date]

Swift:

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).

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

дата не зависит от любого часового пояса, поэтому используйте Dateformatter и прикрепите часовой пояс для отображения:

swift:

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]);

Xcode 9 * Swift 4 или Swift 3:

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

на данный момент (с последними изменениями в Swift), NSDate.date() больше не доступен.

вместо этого вам просто нужно инициализировать NSDate и он получает текущую дату и время.
Чтобы попробовать его, на детской площадке:

var d = NSDate()
d

вы получаете:

Oct 22, 2014, 12:20 PM"  

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

мой 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

Я нашел более простой способ получить UTC в Swift4. Поместите этот код в площадка

дата = дата() // "15 марта 2018 года в 4: 01 вечера"

пусть dateFormatter = DateFormatter() dateFormatter.dateFormat = " гггг-ММ-ДД чч: мм: СС ЗЗЗ" dateFormatter.часовой пояс = часовой пояс (secondsFromGMT: 0)

пусть newDate = dateFormatter.строка (от: дата) //"2018-03-15 21:05:04 +0000"