Получить время UTC и местное время из nsdate объекта
в objective-c следующий код приводит к информации о времени даты UTC с помощью date API.
NSDate *currentUTCDate = [NSDate date]
в Swift однако,
let date = NSDate.date()
результаты в местной дате и времени.
у меня есть два вопроса:
- как я могу получить время UTC и местное время (ну
dateдает местное время) вNSDateобъекты. - как я могу получить точность в течение нескольких секунд от
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Это может помочь вам также форматирования даты:
дата не зависит от любого часового пояса, поэтому используйте 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.currentextension 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"
