Як отримати поточний час як дата


263

Щойно розпочали з ігрового майданчика. Я намагаюся створити простий додаток.

Я створив об’єкт дати таким чином:

var date = NSDate()

Як я можу отримати поточну годину? Іншими мовами я можу зробити щось подібне:

var hour = date.hour

Але я не можу знайти таких властивостей / методів. Я знайшов спосіб, dateWithCalendarFormat. Чи варто це використовувати? Якщо так, ЯК?

Відповіді:


389

Оновлення для 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

Дивіться те саме питання в aim -c Як мені отримати годину і хвилини від NSDate?

Порівняно з відповіддю Нейт, ви отримаєте номери з цим, а не рядки ... виберіть свій вибір!


Привіт, дякую за відповідь, наприклад, якщо хвилина менше двох символів, як я можу повернути її з двома символами типу "04"
Yestay Muratov

2
@YestayMuratov Ця зручна веб-сторінка розповідає про всі можливі способи форматування дати за допомогою NSDateFormatter в Swift :) codingexplorer.com/…
Макс

15
Схоже, що у новій версії Swift (2) вам доведеться використовувати щось подібне до цього let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), тому вертикальний косий нахил вже не можна використовувати тут.
Hola Soy Edu Feliz Navidad

5
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)видалено зайвий '.' перед NSCalendarUnit
cakes88

45
Свіфт 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Obiwahn

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)


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

Швидкий 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-травень-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

У Swift 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

Використання форматів дати -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)

Опут буде, як внизу

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об’єкта, як-от рік, місяць, день тощо ... Метод компонентів
Btw

@LeoDabus необов'язково пропонується, тому що DateComponents.yearаксесуаром єInt?
NoodleOfDeath

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

Швидкий 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

він розширює інтегровану дату недійсності ... він ставить змінну години дати недійсності на значення 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.