Come ottenere l'ora corrente come datetime


265

Ho appena iniziato con il parco giochi. Sto cercando di creare un'app semplice.

Ho creato un oggetto data come questo:

var date = NSDate()

Come posso ottenere l'ora corrente? In altre lingue posso fare qualcosa del genere:

var hour = date.hour

Ma non riesco a trovare proprietà / metodi del genere. Ho trovato un metodo, dateWithCalendarFormat. Dovrei usarlo? Se é cosi, come?

Risposte:


390

Aggiornamento per Swift 3:

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

Lo faccio:

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

Vedi la stessa domanda in goal -c Come posso ottenere ore e minuti da NSDate?

Rispetto alla risposta di Nate, otterrai numeri con questo, non stringhe ... scegli la tua scelta!


Ciao, grazie per la risposta, ad esempio se minuto è inferiore a due caratteri come posso restituirlo con due caratteri come "04"
Yestay Muratov

2
@YestayMuratov Questa utile pagina web racconta tutti i modi possibili per formattare una data utilizzando NSDateFormatter in Swift :) codingexplorer.com/…
Max

15
Sembra che la nuova versione di Swift (2) devi usare qualcosa di simile let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), la barra verticale non può più essere utilizzata qui.
Hola Soy Edu Feliz Navidad,

5
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)rimosso il "." extra prima della NSCalendarUnit
cakes88

45
Swift 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Obiwahn l'

184

Testato con Swift 4

Ottenere la data e l'ora correnti

È possibile ottenere la data e l'ora correnti semplicemente come questo:

let currentDateTime = Date()

Tuttavia, Dateè un numero in virgola mobile a 64 bit che misura il numero di secondi dalla data di riferimento del 1 gennaio 2001 alle 00:00:00 UTC . Posso vedere quel numero per il datetime corrente usando

Date().timeIntervalSinceReferenceDate

Al momento della stesura di questo articolo, è tornato 497626515.185066, probabilmente non esattamente quello che stai cercando. Continua a leggere.

Creare un'altra data e ora

Metodo 1

Se conosci il numero di secondi prima o dopo la data di riferimento, puoi usarlo.

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

Metodo 2

Certo, sarebbe più facile usare cose come anni, mesi, giorni e ore (piuttosto che secondi relativi) per fare un Date. Per questo è possibile utilizzare DateComponentsper specificare i componenti e quindi Calendarper creare la data. La Calendardà il Datecontesto. Altrimenti, come potrebbe sapere in quale fuso orario o calendario esprimerlo?

// 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)

Altre abbreviazioni del fuso orario sono disponibili qui . Se lo lasci vuoto, l'impostazione predefinita è utilizzare il fuso orario dell'utente.

Metodo 3

Il modo più conciso (ma non necessariamente il migliore) potrebbe essere l'uso DateFormatter.

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

Gli standard tecnici Unicode mostrano altri formati che DateFormattersupportano.

Visualizzazione della data e dell'ora

Metodo 1

Se si desidera visualizzare solo determinati componenti della data o dell'ora, è possibile utilizzare CalendarUnitper specificare i componenti da cui si desidera estrarre 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

Vedi anche questa risposta .

Metodo 2

Il metodo 1 ti ha fornito i componenti, ma sarebbe molto difficile formattare quei numeri per ogni stile, lingua e regione. E non è necessario. Questo è già stato fatto per te con la DateFormatterclasse.

// 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

Ecco una continuazione del codice sopra che mostra più opzioni di formattazione:

// "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)

Tieni presente, tuttavia, che questo è per l'inglese con la regione impostata negli Stati Uniti. Per altre lingue e regioni la formattazione avrà un aspetto diverso.

Ulteriore studio


58

Puoi anche utilizzare il metodo di convenienza di NSDateFormatter, ad es.

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

2
La creazione di un NSDateFormatter è costosa. Dovresti crearlo e riutilizzarlo.
Rog

3
Swift 3: let timestamp = DateFormatter.localizedString (from: Date (), dateStyle: .short, timeStyle: .short)
Brian

51

Swift semplifica notevolmente la creazione e l'utilizzo delle estensioni. Creo un sharedCode.swiftfile e inserisco enumerazioni, estensioni e altre cose divertenti. Ho creato NSDateun'estensione per aggiungere alcune funzionalità tipiche che sono laboriose e brutte da digitare ripetutamente:

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
    }
}

usando questa estensione ora puoi fare qualcosa del tipo:

        //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()))")

Che per le 11:51 scrivo:

(Ora corrente = 11) (Minuto corrente = 51) (Stringa corrente breve = 11:51)


26

Swift 2 risponde:

 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

PRODUZIONE

2018-mag-01 10:41:31


1
l'intervallo non viene mai utilizzato.
Nerdy Bunz,

11

Swift 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: non sono sicuro di cosa significhi esattamente la domanda ottenendo l'ora corrente (e l'ora) come ora della data, ma si spera che quanto sopra dovrebbe spiegare abbastanza per rispondere alla domanda.


La risposta di SaRaVaNaN DM sopra aveva un '()' extra alla fine di Calendar.current.
Charlie Seligman,

10

Con Swift 5, Foundationoffre molti modi per ottenere il valore dell'ora da un Dateoggetto. In base alle tue esigenze, puoi scegliere uno dei quattro seguenti frammenti di codice Playground .


# 1. Usando il Calendar dateComponents(_:from:)metodo

Calendarha un metodo chiamato dateComponents(_:from:). dateComponents(_:from:)ha la seguente dichiarazione:

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

Restituisce tutti i componenti data di una data, utilizzando il fuso orario del calendario.

Uso:

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. Usando il Calendar component(_:from:)metodo

Calendarha un metodo chiamato component(_:from:). component(_:from:)ha la seguente dichiarazione:

Restituisce il valore per un componente di una data.

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

Uso:

import Foundation

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

# 3. Utilizzando la DateFormatter dateFormatproprietà

DateFormatterha una proprietà chiamata dateFormat. dateFormatha la seguente dichiarazione:

var dateFormat: String! { get set }

La stringa del formato della data utilizzata dal destinatario.

Uso:

import Foundation

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

# 4. Usando il Dateformatter setLocalizedDateFormatFromTemplate(_:)metodo

Dateformatterha un metodo chiamato setLocalizedDateFormatFromTemplate(_:). setLocalizedDateFormatFromTemplate(_:)ha la seguente dichiarazione:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

Imposta il formato della data da un modello utilizzando le impostazioni internazionali specificate per il destinatario.

Uso:

import Foundation

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

7

se hai solo bisogno dell'ora del giorno

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

6

In 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

Utilizzo di 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)

Data e ora di aggiornamento ogni secondo

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)

    }

Nota: DateAndTime nel codice timer è il nome della classe.


5

So che ci sono molte risposte, ma penso che la mia possa essere più conveniente per molti

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

Puoi provare questo

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)
    }

Ora chiama quel metodo e ricevi la data con ora, min e secondo

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

4

È possibile utilizzare in rapido 4 o 5 come muggito

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

Ouput sarà come muggito

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

o anche soloDate().hour
NoodleOfDeath

1
@NoodleOfDeath sicuramente. Dipende se è necessario o meno un riferimento alla data.
Leo Dabus,

Molto vero, e suppongo che per tutti gli scopi intensivi, si vorrebbe usare la stessa variabile di data quando si generano componenti di data correlati piuttosto che uno appena generato per ciascun componente di data
NoodleOfDeath

3

Espandersi sulla soluzione epicamente concisa di noiiv , ecco l'implementazione Swift 3/4 ancora più concisa:

Swift 3/4

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

Inoltre, espandendo l'estensione di Leo Dabus possiamo avere:

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 }

}

E usalo così:

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

non è necessario restituire un opzionale quando si ottiene qualcosa come l'anno, il mese, il giorno, ecc ... da un Dateoggetto. Il metodo del componente Calendario
Btw

@LeoDabus l'opzione è propagandata perché l' DateComponents.yearaccessor èInt?
NoodleOfDeath

1
puoi utilizzare il metodo del componente Calendario che restituisce non facoltativo. Puoi anche forzare lo scartamento. Non fallirà mai. Ma mi
atterrei al

@LeoDabus aggiornato per utilizzare il componentmetodo per tali accessori
NoodleOfDeath

2

solo per la data nel formato specifico

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

1
Solo una nota, quando si utilizza NSDateFormatter, questi sono oggetti costosi da creare, quindi potresti voler usare un getter pigro per riutilizzare lo stesso NSDateFormatter se stai usando questo codice in una tabella o collezione o qualcosa del genere. Gli stili e il formato possono essere cambiati in modo banale laddove necessario senza influire sulle prestazioni tanto quanto ricrearli ovunque siano necessari. Saluti.!
jcpennypincher,

2

Swift 5

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

e funzione Call printTimestamp ()


1

Puoi creare un'estensione Date, in questo modo puoi facilmente chiamarla in altri file. Ecco un esempio di estensione di data che utilizza una proprietà calcolata.

Lo stamperà: "Oggi, 16:55"

extension Date {

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

        return formatter
    }
}

1

Puoi usare il muggito di Swift4 o Swift 5 come:

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

uscita come:

2020-03-02

0

Nel caso in cui sia necessario formattare la risposta in un modo particolare, è possibile utilizzare facilmente questo metodo, il valore predefinito = "gg-MM-aaaa".

extension Date {

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

Ora è possibile ottenere la data odierna utilizzando

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
        }
}

per favore, spiega la tua risposta.
Mr Maavin,

estende la data vuota void ... mette la variabile hour di void Date al valore int, come anche la variabile minute, quindi restituisce ora e minuti come valore int. Dopodiché puoi usarlo nel codice come preferisci. Ad esempio, puoi chiamare quei valori da DateComponents () - DateComponents.hour = Date.hour () - ti dà il valore int dell'ora corrente.
Vladimir Sukanica,

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

Ecco l' estensione SWIFT per ottenere l'ora della posizione del dispositivo corrente (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)!
}

Prendi ora il tempo: -

Date().getGMTTimeDate()

0

Funziona con Swift 5 (Xcode 10 e Xcode 11) (dalla Francia 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
}

Se si desidera visualizzare solo la data, impostare formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

Per visualizzare solo le ore, passare formatter.dateFormata

formatter.dateFormat = "HH:mm"

Non dimenticate di aggiungere getCurrentDateTime()su viewDidLoad.


-1

È possibile ottenere da Dateformatter

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateString = dateFormatter.string(from:Date())
print(dateString)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.