Как получить текущее время в качестве даты и времени


265

Только началось с детской площадки. Я пытаюсь создать простое приложение.

Я создал объект даты следующим образом:

var date = NSDate()

Как я могу получить текущий час? На других языках я могу сделать что-то вроде этого:

var hour = date.hour

Но я не могу найти какие-либо свойства / методы, подобные этому. Я нашел метод dateWithCalendarFormat. Должен ли я использовать это? Если так, то КАК?

Ответы:


390

Обновление для Swift 3:

let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)

Я сделаю это:

let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date)
let hour = components.hour
let minutes = components.minute

Смотрите тот же вопрос в target -c. Как получить часы и минуты от NSDate?

По сравнению с ответом Нейта, вы получите цифры, а не строки ... выберите свой выбор!


Здравствуйте, спасибо за ответ, например, если минута меньше двух символов, как я могу вернуть его с двумя символами вроде «04»
Естай Муратов

2
@YestayMuratov На этой удобной веб-странице рассказывается о всех возможных способах форматирования даты с использованием NSDateFormatter в Swift :) codingexplorer.com/…
Max

15
Похоже, что в новой версии Swift (2) вам придется использовать что-то похожее let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), вертикальная косая черта здесь больше не используется.
Привет Сой Эду Фелиз Навидад

5
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)убрал лишнее '.' до NSCalendarUnit
cakes88

45
Swift 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Обиван

184

Протестировано с Swift 4

Получение текущей даты и времени

Вы можете получить текущую дату и время так же просто, как это:

let currentDateTime = Date()

Однако Dateэто 64-разрядное число с плавающей запятой, которое измеряет количество секунд с базовой даты 1 января 2001 года в 00:00:00 UTC . Я могу увидеть этот номер для текущей даты и времени, используя

Date().timeIntervalSinceReferenceDate

На момент написания статьи он вернулся 497626515.185066, вероятно, не совсем то, что вы ищете. Продолжай читать.

Создание другой даты и времени

Способ 1

Если вы знаете количество секунд до или после отчетной даты, вы можете использовать это.

let someOtherDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM

Способ 2

Конечно, было бы проще использовать такие вещи, как годы, месяцы, дни и часы (а не относительные секунды) для создания Date. Для этого вы можете использовать, DateComponentsчтобы указать компоненты, а затем Calendarсоздать дату. Это Calendarдает Dateконтекст. Иначе как бы он узнал, в каком часовом поясе или календаре это выражать?

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1980
dateComponents.month = 7
dateComponents.day = 11
dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time
dateComponents.hour = 8
dateComponents.minute = 34

// Create date from components
let userCalendar = Calendar.current // user calendar
let someDateTime = userCalendar.date(from: dateComponents)

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

Способ 3

Наиболее кратким способом (но не обязательно лучшим) может быть использование DateFormatter.

let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let someDateTime = formatter.date(from: "2016/10/08 22:31")

В технических стандартах Unicode показать другие форматы , что DateFormatterподставки.

Отображение даты и времени

Способ 1

Если вы хотите просто отобразить определенные компоненты даты или времени, вы можете использовать их CalendarUnitдля указания компонентов, из которых вы хотите извлечь Date.

// get the current date and time
let currentDateTime = Date()

// get the user's calendar
let userCalendar = Calendar.current

// choose which date and time components are needed
let requestedComponents: Set<Calendar.Component> = [
    .year,
    .month,
    .day,
    .hour,
    .minute,
    .second
]

// get the components
let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDateTime)

// now the components are available
dateTimeComponents.year   // 2016
dateTimeComponents.month  // 10
dateTimeComponents.day    // 8
dateTimeComponents.hour   // 22
dateTimeComponents.minute // 42
dateTimeComponents.second // 17

Смотрите также этот ответ .

Способ 2

Метод 1 дал вам компоненты, но было бы много работы для форматирования этих чисел для каждого стиля, языка и региона. И вам не нужно. Это уже было сделано для вас с DateFormatterклассом.

// get the current date and time
let currentDateTime = Date()

// initialize the date formatter and set the style
let formatter = DateFormatter()
formatter.timeStyle = .medium
formatter.dateStyle = .long

// get the date time String from the date object
formatter.string(from: currentDateTime) // October 8, 2016 at 10:48:53 PM

Вот продолжение приведенного выше кода, который показывает больше параметров форматирования:

// "10/8/16, 10:52 PM"
formatter.timeStyle = .short
formatter.dateStyle = .short
formatter.string(from: currentDateTime)

// "Oct 8, 2016, 10:52:30 PM"
formatter.timeStyle = .medium
formatter.dateStyle = .medium
formatter.string(from: currentDateTime)

// "October 8, 2016 at 10:52:30 PM GMT+8"
formatter.timeStyle = .long
formatter.dateStyle = .long
formatter.string(from: currentDateTime)

// "October 8, 2016"
formatter.timeStyle = .none
formatter.dateStyle = .long
formatter.string(from: currentDateTime)

// "10:52:30 PM"
formatter.timeStyle = .medium
formatter.dateStyle = .none
formatter.string(from: currentDateTime)

Имейте в виду, однако, что это для английского языка с регионом США. Для других языков и регионов форматирование будет выглядеть иначе.

Дальнейшее обучение


58

Вы также можете использовать удобный метод NSDateFormatter, например,

func printTimestamp() {
  let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle)
  print(timestamp)
}
printTimestamp() // Prints "Sep 9, 2014, 4:30 AM"

2
Создание NSDateFormatter стоит дорого. Вы должны создать и повторно использовать его.
Рог

3
Swift 3: let timestamp = DateFormatter.localizedString (from: Date (), dateStyle: .short, timeStyle: .short)
Брайан

51

Swift позволяет легко создавать и использовать расширения. Я создаю sharedCode.swiftфайл и помещаю в него перечисления, расширения и другие забавные вещи. Я создал NSDateрасширение, чтобы добавить некоторые типичные функциональные возможности, которые трудно и некрасиво печатать снова и снова:

extension NSDate
{
    func hour() -> Int
    {
        //Get Hour
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(.Hour, fromDate: self)
        let hour = components.hour

        //Return Hour
        return hour
    }


    func minute() -> Int
    {
        //Get Minute
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(.Minute, fromDate: self)
        let minute = components.minute

        //Return Minute
        return minute
    }

    func toShortTimeString() -> String
    {
        //Get Short Time String
        let formatter = NSDateFormatter()
        formatter.timeStyle = .ShortStyle
        let timeString = formatter.stringFromDate(self)

        //Return Short Time String
        return timeString
    }
}

используя это расширение, вы можете сделать что-то вроде:

        //Get Current Date
        let currentDate = NSDate()

        //Test Extensions in Log
        NSLog("(Current Hour = \(currentDate.hour())) (Current Minute = \(currentDate.minute())) (Current Short Time String = \(currentDate.toShortTimeString()))")

Который за 11:51 написал бы:

(Текущий час = 11) (Текущая минута = 51) (Текущая короткая временная строка = 11:51 AM)


26

Swift 2 ответ:

 let date = NSDate()
 let calendar = NSCalendar.currentCalendar()
 let components = calendar.components([.Hour, .Minute], fromDate: date)
 let hour = components.hour
 let minutes = components.minute

23

Swift 4

let dateFormatter : DateFormatter = DateFormatter()
//  dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.dateFormat = "yyyy-MMM-dd HH:mm:ss"
let date = Date()
let dateString = dateFormatter.string(from: date)
let interval = date.timeIntervalSince1970

ВЫВОД

2018-May-01 10:41:31


1
интервал никогда не используется.
Nerdy Bunz

11

Свифт 3:

static func currentTime() -> String {
    let date = Date()
    let calendar = Calendar.current
    let hour = calendar.component(.hour, from: date)
    let minutes = calendar.component(.minute, from: date)
    return "\(hour):\(minutes)"
}

PS - не уверен, что именно означает вопрос, принимая текущее время (и час) в качестве даты, но, надеюсь, вышесказанное должно объяснить достаточно, чтобы ответить на вопрос.


Ответ от SaRaVaNaN DM выше содержал дополнительную '()' в конце Calendar.current.
Чарли Селигман

10

С Swift 5 Foundationпредлагает много способов получить значение часа от Dateобъекта. В зависимости от ваших потребностей вы можете выбрать один из четырех следующих фрагментов кода Playground .


# 1. Используя Calendar dateComponents(_:from:)метод

Calendarимеет метод с именем dateComponents(_:from:). dateComponents(_:from:)имеет следующую декларацию:

func dateComponents(_ components: Set<Calendar.Component>, from date: Date) -> DateComponents

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

Использование:

import Foundation

let date = Date()
let dateComponents = Calendar.current.dateComponents([.hour], from: date)
let hour = dateComponents.hour
print(String(describing: hour)) // may print: Optional(13)

# 2. Используя Calendar component(_:from:)метод

Calendarимеет метод с именем component(_:from:). component(_:from:)имеет следующую декларацию:

Возвращает значение для одного компонента даты.

func component(_ component: Calendar.Component, from date: Date) -> Int

Использование:

import Foundation

let date = Date()
let hour = Calendar.current.component(.hour, from: date)
print(hour) // may print: 13

# 3. Использование DateFormatter dateFormatсвойства

DateFormatterимеет свойство под названием dateFormat. dateFormatимеет следующую декларацию:

var dateFormat: String! { get set }

Строка формата даты, используемая получателем.

Использование:

import Foundation

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH"
let hour = dateFormatter.string(from: date)
print(hour) // may print: 13

# 4. Используя Dateformatter setLocalizedDateFormatFromTemplate(_:)метод

Dateformatterимеет метод с именем setLocalizedDateFormatFromTemplate(_:). setLocalizedDateFormatFromTemplate(_:)имеет следующую декларацию:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

Устанавливает формат даты из шаблона, используя указанную локаль для получателя.

Использование:

import Foundation

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("HH")
let hour = dateFormatter.string(from: date)
print(hour) // may print: 13

7

если вам просто нужен час дня

let calendar = NSCalendar.currentCalendar()
var hour = calendar.component(.Hour,fromDate: NSDate())

6

В Свифте 3

    let date = Date()
    let calendar = Calendar.current()

    let hour = calendar.component(.hour, from: date)

let calendar = Calendar.current; let unitFlags: Set<Calendar.Component> = Set<Calendar.Component ([.hour]); let components = calendar.dateComponents(unitFlags, from: self)
AbdulMomen عبدالمؤمن

6

Использование Date Formatter -Swift 3.0

//Date
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
let dateString = "Current date is: \(dateFormatter.string(from: Date() as Date))"
labelfordate.text = String(dateString)


//Time    
let timeFormatter = DateFormatter()
timeFormatter.timeStyle = .medium
let timeString = "Current time is: \(timeFormatter.string(from: Date() as Date))"
labelfortime.text = String(timeString)

Обновление даты и времени каждые секунды

override func viewDidLoad() {
super.viewDidLoad()

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(DateAndTime.action), userInfo: nil, repeats: true)

       }

func action()
    {
    //Date
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    let dateString = "Current date is: \(dateFormatter.string(from: Date() as Date))"
    labelfordate.text = String(dateString)


    //Time
    let timeFormatter = DateFormatter()
    timeFormatter.timeStyle = .medium
    let timeString = "Current time is: \(timeFormatter.string(from: Date() as Date))"
    labelfortime.text = String(timeString)

    }

Примечание. DateAndTime в коде таймера является именем класса.


5

Я знаю, что есть много ответов, но я думаю, что мой может быть более удобным для многих

extension String {
    init(epoch: Double) {
        let date = Date(timeIntervalSince1970: epoch)

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd/MM/yyyy HH:mm:ssZZZ"

        self = dateFormatter.string(from: date)
    }
}

4

Вы можете попробовать это

func getTime() -> (hour:Int, min:Int, sec:Int) {
        let currentDateTime = NSDate()
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components([.Hour,.Minute,.Second], fromDate: currentDateTime)
        let hour = components.hour
        let min = components.minute
        let sec = components.second
        return (hour,min,sec)
    }

Теперь вызовите этот метод и получите дату с часами, минутами и секундами

    let currentTime = self.getTime()
    print("Hour: \(currentTime.hour) Min: \(currentTime.min) Sec: \(currentTime.sec))")

4

Вы можете использовать в быстрой 4 или 5, как показано ниже

let date = Date()
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = df.string(from: date)

Ouput будет как ниже

2019-12-20 09:40:08

3

Xcode 8.2.1 • Swift 3.0.2

extension Date {
    var hour: Int { return Calendar.autoupdatingCurrent.component(.hour, from: self) }
}

let date = Date()      // "Mar 16, 2017, 3:43 PM"
let hour = date.hour   // 15

или даже простоDate().hour
NoodleOfDeath

1
@NoodleOfDeath уверен. Это зависит от того, нужна ли ссылка на дату или нет.
Лев Дабус

Совершенно верно, и я полагаю, что для всех интенсивных целей вы хотели бы использовать одну и ту же переменную даты при создании связанных компонентов даты, а не вновь сгенерированную переменную для каждого компонента даты
NoodleOfDeath

3

В продолжение эпически краткого решения noiiv , вот еще более лаконичная реализация Swift 3/4:

Свифт 3/4

let components = Calendar.current.dateComponents([.hour, .minute], from: Date())
let (hour, minute) = (components.hour, components.minute)

Также, расширив расширение Лео Дабуса, мы можем иметь:

extension Date {

    func components(_ components: Set<Calendar.Component>) -> DateComponents {
        return Calendar.current.dateComponents(components, from: self)
    }

    func component(_ component: Calendar.Component) -> Int {
        return Calendar.current.component(component, from: self)
    }

    var era: Int { return component(.era) }
    var year: Int { return component(.year) }
    var month: Int { return component(.month) }
    var day: Int { return component(.day) }
    var hour: Int { return component(.hour) }
    var minute: Int { return component(.minute) }
    var second: Int { return component(.second) }
    var weekday: Int { return component(.weekday) }
    var weekdayOrdinal: Int { return component(.weekdayOrdinal) }
    var quarter: Int { return component(.quarter) }
    var weekOfMonth: Int { return component(.weekOfMonth) }
    var weekOfYear: Int { return component(.weekOfYear) }
    var yearForWeekOfYear: Int { return component(.yearForWeekOfYear) }
    var nanosecond: Int { return component(.nanosecond) }
    var calendar: Calendar? { return components([.calendar]).calendar }
    var timeZone: TimeZone? { return components([.timeZone]).timeZone }

}

И используйте это так:

let date = Date()
let (hour, minute) = (date.hour, date.minute)

не нужно возвращать необязательное значение при получении Dateобъекта, например, года, месяца, дня и т . д. Кстати, метод компонента календаря больше подходит для одного компонента
Лео Дабус

@LeoDabus опциональное распространение не распространяется, потому что DateComponents.yearInt?
средство

1
Вы можете использовать метод компонента Calendar, который возвращает не обязательно. Вы также можете принудительно развернуть. Это никогда не подведет. Но я бы придерживался метода одноэлементного компонента
Лео Дабус

@LeoDabus обновлен, чтобы использовать componentметод для этих методов доступа
NoodleOfDeath

2

только для даты в определенном формате

    let dateFormatter1 = NSDateFormatter()
    dateFormatter1.dateStyle = .MediumStyle
    dateFormatter1.timeStyle = .NoStyle
    dateFormatter1.dateFormat = "dd-MM-yyyy"
    let date = dateFormatter1.stringFromDate(NSDate())

1
Просто обратите внимание, что при использовании NSDateFormatter эти дорогостоящие объекты создаются, поэтому вы можете использовать ленивый метод получения, чтобы повторно использовать тот же NSDateFormatter, если вы используете этот код в таблице или коллекции или что-то в этом роде. Стили и формат можно изменить тривиально, где это необходимо, не влияя на производительность, а создавая их заново там, где это необходимо. Приветствия.!
jcpennypincher

2

Swift 5

func printTimestamp() {
    let timestamp = DateFormatter.localizedString(from: NSDate() as Date, dateStyle: .medium, timeStyle: .short)
    print(timestamp)
}

и вызов функции printTimestamp ()


1

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

Он распечатает это: «Сегодня, 16:55»

extension Date {

    var formatter: DateFormatter? {
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        formatter.timeStyle = .short
        formatter.doesRelativeDateFormatting = true

        return formatter
    }
}

1

Вы можете использовать Swift4 или Swift 5 ниже:

let date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let current_date = dateFormatter.string(from: date)
print("current_date-->",current_date)

вывод как:

2020-03-02

0

Если вам нужно отформатировать ответ определенным образом, вы можете легко использовать этот метод, по умолчанию = "dd-MM-yyyy".

extension Date {

   func today(format : String = "dd-MM-yyyy") -> String{
      let date = Date()
      let formatter = DateFormatter()
      formatter.dateFormat = format
      return formatter.string(from: date)
   }
}

Получение сегодняшней даты теперь можно сделать с помощью

Date().today() or Date().today("dd/MM/yyyy") 

0

SWIFT 4:

extension Date
{
    func hour() -> Int
    {
    //Get Hour
    let calendar = Calendar.current
    let components = calendar.component(.hour, from: self)
    let hour = components

    //Return Hour
    return hour
    }


    func minute() -> Int
    {
    //Get Minute
    let calendar = Calendar.current
    let components = calendar.component(.minute, from: self)
    let minute = components

    //Return Minute
    return minute
        }
}

пожалуйста, объясните свой ответ.
MrMaavin

он расширяет интегрированную дату void ... он помещает переменную часа void Date в значение int, а также переменную минуты, затем возвращает часы и минуты как значение int. После этого вы можете использовать его в коде любым удобным вам способом. Например, затем вы можете вызвать эти значения из DateComponents () - DateComponents.hour = Date.hour () - это дает вам значение int текущего времени.
Владимир Суканица

0
func getCurrentDate() -> Date {
    let date = Date()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let dateInString  = dateFormatter.string(from: date)
    let dateinDate = dateFormatter.date(from: dateInString)
    return dateinDate!
}

0

Вот расширение SWIFT, чтобы получить ваше текущее время местоположения устройства (GMT).

func getGMTTimeDate() -> Date {
   var comp: DateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self)
   comp.calendar = Calendar.current
   comp.timeZone = TimeZone(abbreviation: "GMT")!
   return Calendar.current.date(from: comp)!
}

Получить сейчас время: -

Date().getGMTTimeDate()

0

Работает со Swift 5 (Xcode 10 и Xcode 11) (из Франции UTC)

func getCurrentDateTime() {
    let now = Date()
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "fr_FR")
    formatter.dateFormat = "EEEE dd MMMM YYYY HH:mm"
    myLabel.text = formatter.string(from: now)
    myLabel.font = UIFont(name: "HelveticaNeue-Light", size: 12)
    myLabel.textColor = UIColor.black
}

Если вы хотите отображать только дату, установите formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

Для отображения только часов, измените formatter.dateFormatна

formatter.dateFormat = "HH:mm"

Не забудьте добавить getCurrentDateTime()в viewDidLoad.


-1

Вы можете получить от Dateformatter

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateString = dateFormatter.string(from:Date())
print(dateString)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.