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

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

 NSDate *currentUTCDate = [NSDate date] 

В Swift, однако,

 let date = NSDate.date() 

приводит к местным датам и времени.

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

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

EDIT 1: Спасибо за все входные данные, но я не ищу объекты NSDateFormatter или строковые значения. Я просто ищу объекты NSDate (однако мы их готовим, но это требование).
См. Пункт 1.

8 Solutions collect form web for “Получить время UTC и местное время от объекта NSDate”

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

Проблема, вероятно, находится где-то, где вы NSDateFormatter дату, используя NSDateFormatter . NSDate – это всего лишь точка на временной линии. В NSDate нет часовых поясов. Я сделал тест.

стриж

 print(NSDate.date()) 

После последних обновлений новый синтаксис:

 print(NSDate()) 

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

Objective-C

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

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

Результат – нет разницы.

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

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

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

Objective-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.dateFormat = "HH:mm:ss.SSS" return formatter }() static let preciseGMTTime: DateFormatter = { let formatter = DateFormatter() 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 и установите часовой пояс для отображения:

скоро:

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

На данный момент (с последними изменениями в 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 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

Моя версия 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 
  • SWIFT конвертирует NSTimeInteval в NSDate
  • Как добавить временной интервал на 1 мин объекту NSDate в iPhone
  • Swift 3 - Неоднозначное использование оператора <при сравнении двух дат
  • Формат даты для 2016-10-20T13: 01: 47.317
  • Как я могу сделать обратный отсчет с текущей даты на определенный NSDate?
  • Почему NSDate нельзя сравнивать с помощью <или>?
  • Преобразование UTC NSDate в локальный часовой пояс Objective-C
  • первый и последний день текущего месяца в быстром
  • Различные результаты для в нескольких устройствах
  • Когда dateByAddingComponents: toDate: options return nil?
  • Как получить все воскресенья через месяц
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.