Cómo obtener la hora actual como fecha y hora

265

Acabo de empezar con el patio de recreo. Estoy tratando de crear una aplicación simple.

He creado un objeto de fecha como este:

var date = NSDate()

¿Cómo puedo obtener la hora actual? En otros idiomas puedo hacer algo como esto:

var hour = date.hour

Pero no puedo encontrar ninguna propiedad / método como ese. He encontrado un método, dateWithCalendarFormat. ¿Debo usar eso? ¿Si es así, cómo?

JOSEFtw
fuente

Respuestas:

390

Actualización para Swift 3:

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

Hago esto:

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

Vea la misma pregunta en el objetivo-c ¿Cómo obtengo horas y minutos de NSDate?

En comparación con la respuesta de Nate, obtendrá números con este, no cadenas ... ¡elija su elección!

noliv
fuente
Hola, gracias por la respuesta, por ejemplo, si el minuto tiene menos de dos caracteres, ¿cómo puedo devolverlo con dos caracteres como "04"
Yestay Muratov
2
@YestayMuratov Esta práctica página web cuenta con todas las formas posibles de formatear una fecha usando NSDateFormatter en Swift :) codingexplorer.com/…
Max
15
Parece que la nueva versión Swift (2) tiene que usar algo similar let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), la barra vertical ya no se puede usar aquí.
Hola Soy Edu Feliz Navidad
55
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)eliminado el extra '.' antes de NSCalendarUnit
cakes88
45
Swift 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Obiwahn
184

Probado con Swift 4

Obtener la fecha y hora actuales

Puede obtener la fecha y hora actuales de la siguiente manera:

let currentDateTime = Date()

Sin embargo, Datees un número de coma flotante de 64 bits que mide la cantidad de segundos desde la fecha de referencia del 1 de enero de 2001 a las 00:00:00 UTC . Puedo ver ese número para la fecha y hora actual usando

Date().timeIntervalSinceReferenceDate

Al momento de escribir esto, regresó 497626515.185066, probablemente no exactamente lo que estaba buscando. Sigue leyendo.

Crear otra fecha y hora

Método 1

Si conoce el número de segundos antes o después de la fecha de referencia, puede usar eso.

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

Método 2

Por supuesto, sería más fácil usar cosas como años, meses, días y horas (en lugar de segundos relativos) para hacer un Date. Para esto, puede usar DateComponentspara especificar los componentes y luego Calendarcrear la fecha. El Calendarda el Datecontexto. De lo contrario, ¿cómo sabría en qué zona horaria o calendario expresarlo?

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

Aquí se pueden encontrar otras abreviaturas de zona horaria . Si lo deja en blanco, el valor predeterminado es utilizar la zona horaria del usuario.

Método 3

La forma más sucinta (pero no necesariamente la mejor) podría ser usar DateFormatter.

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

Los estándares técnicos Unicode muestran otros formatos queDateFormatter soporta.

Mostrar la fecha y la hora

Método 1

Si solo desea mostrar ciertos componentes de la fecha o la hora, puede usar CalendarUnitpara especificar los componentes de los que desea extraer 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

Ver esta respuesta también.

Método 2

El Método 1 le proporcionó los componentes, pero sería mucho trabajo formatear esos números para cada estilo, idioma y región. Y no necesitas hacerlo. Esto ya se hizo con la DateFormatterclase.

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

Aquí hay una continuación del código anterior que muestra más opciones de formato:

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

Sin embargo, tenga en cuenta que esto es para inglés con la región establecida en los EE. UU. Para otros idiomas y regiones, el formato se verá diferente.

Estudio adicional

Suragch
fuente
58

También puede usar el método de conveniencia de NSDateFormatter, por ejemplo,

func printTimestamp() {
  let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle)
  print(timestamp)
}
printTimestamp() // Prints "Sep 9, 2014, 4:30 AM"
Scott Gardner
fuente
2
Crear un NSDateFormatter es costoso. Debe crear y reutilizarlo.
Rog
3
Swift 3: let timestamp = DateFormatter.localizedString (from: Date (), dateStyle: .short, timeStyle: .short)
Brian
51

Swift hace que sea realmente fácil crear y usar extensiones. Creo un sharedCode.swiftarchivo y pongo enumeraciones, extensiones y otras cosas divertidas en él. Creé una NSDateextensión para agregar alguna funcionalidad típica que es laboriosa y fea de escribir una y otra vez:

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 esta extensión ahora puede hacer algo como:

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

Que para las 11:51 AM escribiría:

(Hora actual = 11) (Minuto actual = 51) (Cadena de tiempo corto actual = 11:51 AM)

usuario2266987
fuente
26

Respuesta rápida 2:

 let date = NSDate()
 let calendar = NSCalendar.currentCalendar()
 let components = calendar.components([.Hour, .Minute], fromDate: date)
 let hour = components.hour
 let minutes = components.minute
Matthieu Riegler
fuente
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

SALIDA

2018-mayo-01 10:41:31

Keshav Gera
fuente
1
el intervalo nunca se usa.
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)"
}

PD: no estoy seguro de lo que significa la pregunta exactamente al obtener la hora actual (y la hora) como hora de fecha, pero espero que lo anterior explique lo suficiente como para responder la pregunta.

Charlie Seligman
fuente
La respuesta de SaRaVaNaN DM anterior tenía un '()' extra al final de Calendar.current.
Charlie Seligman el
10

Con Swift 5, Foundationofrece muchas formas de obtener el valor horario de un Dateobjeto. Según sus necesidades, puede elegir uno de los siguientes cuatro fragmentos de código de Playground .


# 1 UtilizandoCalendar dateComponents(_:from:) método

Calendar tiene un método llamado dateComponents(_:from:). dateComponents(_:from:)tiene la siguiente declaración:

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

Devuelve todos los componentes de fecha de una fecha, utilizando la zona horaria 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 UtilizandoCalendar component(_:from:) método

Calendar tiene un método llamado component(_:from:) . component(_:from:)tiene la siguiente declaración:

Devuelve el valor de un componente de una fecha.

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 UtilizandoDateFormatter dateFormat propiedad

DateFormattertiene una propiedad llamada dateFormat. dateFormattiene la siguiente declaración:

var dateFormat: String! { get set }

La cadena de formato de fecha utilizada por el receptor.

Uso:

import Foundation

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

# 4. UtilizandoDateformatter setLocalizedDateFormatFromTemplate(_:) método

Dateformattertiene un método llamado setLocalizedDateFormatFromTemplate(_:). setLocalizedDateFormatFromTemplate(_:)tiene la siguiente declaración:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

Establece el formato de fecha a partir de una plantilla utilizando la configuración regional especificada para el receptor.

Uso:

import Foundation

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

si solo necesitas la hora del día

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

En Swift 3,

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

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

Uso del formateador de fecha -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)

Fecha y hora de actualización cada segundos

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 en el código del temporizador es el nombre de la clase.

Kay Cee
fuente
5

Sé que hay muchas respuestas, pero creo que la mía puede ser más conveniente para muchos

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

fuente
4

Puedes probar esto

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

Ahora llame a ese método y reciba la fecha con hora, min y segundo

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

Puede usar en 4 o 5 rápidos como abajo

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

Ouput será como abajo

2019-12-20 09:40:08
Enamul Haque
fuente
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
Leo Dabus
fuente
o incluso soloDate().hour
NoodleOfDeath
1
@NoodleOfDeath seguro. Eso depende de si se necesita o no una referencia a la fecha.
Leo Dabus
Muy cierto, y supongo que para todos los propósitos intensivos, desearía usar la misma variable de fecha al generar componentes de fecha relacionados en lugar de uno recién generado para cada componente de fecha
NoodleOfDeath
3

Ampliando la solución épicamente concisa de noiiv , aquí está la implementación Swift 3/4 aún más concisa:

Swift 3/4

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

Además, ampliando la extensión de Leo Dabus podemos tener:

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 }

}

Y úsalo así:

let date = Date()
let (hour, minute) = (date.hour, date.minute)
NoodleOfDeath
fuente
no es necesario devolver un elemento opcional al obtener algo como año, mes, día, etc. de un Dateobjeto. Por cierto, el método del componente Calendario es más apropiado para un solo componente
Leo Dabus
@LeoDabus el opcional se propaga porque el DateComponents.yearInt?
descriptor de
1
puede usar el método del componente Calendario que devuelve no opcional. También puedes forzar el desenvolvimiento. Nunca fallará. Pero me quedaría con el método del componente de elemento único
Leo Dabus el
@LeoDabus actualizado para usar el componentmétodo para esos
accesos
2

solo para fecha en formato específico

    let dateFormatter1 = NSDateFormatter()
    dateFormatter1.dateStyle = .MediumStyle
    dateFormatter1.timeStyle = .NoStyle
    dateFormatter1.dateFormat = "dd-MM-yyyy"
    let date = dateFormatter1.stringFromDate(NSDate())
Zain Ullah Muhammad
fuente
1
Solo una nota, al usar NSDateFormatter, estos son objetos caros para crear, por lo que es posible que desee usar un getzy perezoso para reutilizar el mismo NSDateFormatter si está usando este código en una tabla o colección o algo así. Los estilos y el formato se pueden cambiar trivialmente donde sea necesario sin afectar el rendimiento tanto como volver a crearlos donde sea necesario. Salud.!
jcpennypincher
2

Swift 5

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

y la función de llamada printTimestamp ()

KRS
fuente
1

Puede crear una extensión Date, de esa manera puede llamarla fácilmente en otros archivos. Aquí hay un ejemplo de una extensión de fecha que usa una propiedad calculada.

Lo imprimirá: "Hoy, 4:55 PM"

extension Date {

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

        return formatter
    }
}
pcnick13
fuente
1

Puede usar Swift4 o Swift 5 como:

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

salida como:

2020-03-02
Enamul Haque
fuente
0

En caso de que necesite formatear la respuesta de una manera particular, puede usar fácilmente este método, el predeterminado = "dd-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)
   }
}

Obtener la fecha de hoy ahora se puede hacer usando

Date().today() or Date().today("dd/MM/yyyy") 
king_T
fuente
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
        }
}
Vladimir Sukanica
fuente
por favor explique su respuesta
MrMaavin
amplía la fecha integrada vacío ... pone la variable de hora de la fecha vacía en valor int, como también la variable minuto, luego devuelve hora y minuto como valor int. Después de eso, puede usarlo en el código de la forma que desee. Por ejemplo, puede llamar a esos valores desde DateComponents () - DateComponents.hour = Date.hour () - le da el valor int de la hora actual.
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!
}
Abuzar Manzoor
fuente
0

Aquí está la extensión SWIFT para obtener la hora actual de ubicación del dispositivo (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)!
}

Obtenga ahora el tiempo: -

Date().getGMTTimeDate()
Chathuranga Silva
fuente
0

Funciona con Swift 5 (Xcode 10 y Xcode 11) (de France 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
}

Si desea mostrar solo la fecha, configure formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

Para mostrar solo las horas, cambie formatter.dateFormata

formatter.dateFormat = "HH:mm"

No se olvide de añadir getCurrentDateTime()en viewDidLoad.

Benjamin Tourin
fuente
-1

Puede obtener de Dateformatter

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateString = dateFormatter.string(from:Date())
print(dateString)
Ucdemir
fuente