Получить время 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.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"