Como obter a hora atual como data e hora

264

Apenas comecei com o playground. Estou tentando criar um aplicativo simples.

Eu criei um objeto de data como este:

var date = NSDate()

Como posso obter a hora atual? Em outras línguas, eu posso fazer algo assim:

var hour = date.hour

Mas não consigo encontrar nenhuma propriedade / método como esse. Eu encontrei um método dateWithCalendarFormat. Devo usar isso? Se sim, como?

JOSEFtw
fonte

Respostas:

389

Atualização para o Swift 3:

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

Eu faço isso:

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

Veja a mesma pergunta no objetivo-c Como obtenho horas e minutos do NSDate?

Comparado com a resposta de Nate, você obterá números com este, não cordas ... escolha sua escolha!

noliv
fonte
Olá, obrigado pela resposta, por exemplo, se o minuto tiver menos de dois caracteres, como posso devolvê-lo com dois caracteres como "04"?
Yestay Muratov 17/06/2015
2
@YestayMuratov Esta página útil mostra todas as maneiras possíveis de formatar uma data usando o NSDateFormatter no Swift :) codingexplorer.com/…
Max
15
Parece que a nova versão do Swift (2) você precisa usar algo semelhante let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), a barra vertical não pode mais ser usada aqui.
Hola Soy Edu Feliz Navidad
5
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)removeu o extra '.' Antes de NSCalendarUnit
cakes88, 15/10/2015
45
Swift 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Obiwahn
184

Testado com Swift 4

Obtendo a data e hora atuais

Você pode obter a data e hora atuais de maneira simples:

let currentDateTime = Date()

No entanto, Dateé um número de ponto flutuante de 64 bits que mede o número de segundos desde a data de referência de 1 de janeiro de 2001 às 00:00:00 UTC . Eu posso ver esse número para o datetime atual usando

Date().timeIntervalSinceReferenceDate

No momento da redação deste artigo, ele retornou 497626515.185066, provavelmente não exatamente o que você estava procurando. Continue lendo.

Criando outra data e hora

Método 1

Se você souber o número de segundos antes ou depois da data de referência, poderá usá-lo.

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

Método 2

Obviamente, seria mais fácil usar coisas como anos, meses, dias e horas (em vez de segundos relativos) para criar um Date. Para isso, você pode usar DateComponentspara especificar os componentes e Calendarcriar a data. O Calendardá o Datecontexto. Caso contrário, como saberia em que fuso horário ou calendário expressá-lo?

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

Outras abreviações de fuso horário podem ser encontradas aqui . Se você deixar em branco, o padrão é usar o fuso horário do usuário.

Método 3

A maneira mais sucinta (mas não necessariamente a melhor) pode ser usar DateFormatter .

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

o normas técnicas Unicode mostrar outros formatos que DateFormattersuporta.

Exibindo a Data e Hora

Método 1

Se você deseja exibir apenas determinados componentes da data ou hora, pode usar CalendarUnitpara especificar os componentes dos quais deseja extrair 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

Veja esta resposta também.

Método 2

O método 1 forneceu os componentes, mas seria muito trabalhoso formatar esses números para todos os estilos, idiomas e regiões. E você não precisa. Isso já foi feito para você com a DateFormatterturma.

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

Aqui está uma continuação do código acima que mostra mais opções de formatação:

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

Porém, lembre-se de que isso é para inglês com a região definida para os EUA. Para outros idiomas e regiões, a formatação será diferente.

Um estudo mais aprofundado

Suragch
fonte
58

Você também pode usar o método de conveniência do NSDateFormatter, por exemplo,

func printTimestamp() {
  let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle)
  print(timestamp)
}
printTimestamp() // Prints "Sep 9, 2014, 4:30 AM"
Scott Gardner
fonte
2
Criar um NSDateFormatter é caro. Você deve criar e reutilizá-lo.
Rog
3
Swift 3: deixe timestamp = DateFormatter.localizedString (from: Date (), dateStyle: .short, timeStyle: .short)
Brian
51

O Swift facilita muito a criação e o uso de extensões. Crio um sharedCode.swiftarquivo e coloco enumerações, extensões e outras coisas divertidas nele. Eu criei uma NSDateextensão para adicionar algumas funcionalidades típicas que são trabalhosas e feias para digitar repetidamente:

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 extensão, agora você pode fazer 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 por 11:51 AM escreveria:

(Hora atual = 11) (Minuto atual = 51) (Cadeia de tempo curto atual = 11:51)

user2266987
fonte
26

Resposta 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
fonte
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

RESULTADO

2018-May-01 10:41:31

Keshav Gera
fonte
1
o intervalo nunca é usado.
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 - não sei ao certo o que a pergunta significa exatamente ao obter a hora (e a hora) atuais como data e hora, mas espero que o exposto acima explique o suficiente para responder à pergunta.

Charlie Seligman
fonte
SaRaVaNaN A resposta do DM acima tinha um '() extra no final do Calendar.current.
Charlie Seligman
10

Com o Swift 5, Foundationoferece várias maneiras de obter o valor da hora de um Dateobjeto. De acordo com suas necessidades, você pode escolher um dos quatro seguintes trechos de código do Playground .


# 1 Usando o Calendar dateComponents(_:from:)método

Calendartem um método chamado dateComponents(_:from:). dateComponents(_:from:)tem a seguinte declaração:

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

Retorna todos os componentes de uma data, usando o fuso horário do calendário.

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 o Calendar component(_:from:)método

Calendartem um método chamado component(_:from:). component(_:from:)tem a seguinte declaração:

Retorna o valor para um componente de uma 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 Usando DateFormatter dateFormatpropriedade

DateFormattertem uma propriedade chamada dateFormat. dateFormattem a seguinte declaração:

var dateFormat: String! { get set }

A sequência de formato de data usada pelo 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 Usando o Dateformatter setLocalizedDateFormatFromTemplate(_:)método

Dateformattertem um método chamado setLocalizedDateFormatFromTemplate(_:). setLocalizedDateFormatFromTemplate(_:)tem a seguinte declaração:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

Define o formato da data de um modelo usando o código do idioma especificado para o destinatário.

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

se você só precisa da hora do dia

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

No Swift 3,

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

    let hour = calendar.component(.hour, from: date)
SaRaVaNaN DM
fonte
let calendar = Calendar.current; let unitFlags: Set<Calendar.Component> = Set<Calendar.Component ([.hour]); let components = calendar.dateComponents(unitFlags, from: self)
AbdulMomen # 4/16
6

Usando o Formatador de Data - 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)

Atualizar data e hora a cada segundo

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 no código do timer é o nome da classe.

Kay Cee
fonte
5

Sei que há muitas respostas, mas acho que as minhas podem ser mais convenientes para muitos

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

fonte
4

Você pode tentar isso

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

Agora chame esse método e receba a data com hora, minuto e segundo

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

Você pode usar rapidamente 4 ou 5 como abaixo

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

Ouput será como abaixo

2019-12-20 09:40:08
Enamul Haque
fonte
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
fonte
ou mesmo apenasDate().hour
NoodleOfDeath 12/06/19
1
@NoodleOfDeath sure. Isso depende se uma referência à data é necessária ou não.
Leo Dabus
É verdade, e eu suponho que para todos os efeitos intensivos, você iria querer usar a mesma variável data em que a geração de componentes de data relacionados em vez de um recém-gerado para cada componente de data
NoodleOfDeath
3

Expandindo a solução epicamente concisa da noiiv , aqui está a implementação Swift 3/4 ainda mais concisa:

Swift 3/4

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

Além disso, expandindo a extensão de Leo Dabus, podemos ter:

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 use-o assim:

let date = Date()
let (hour, minute) = (date.hour, date.minute)
NoodleOfDeath
fonte
não é necessário retornar um opcional ao obter algo como ano, mês, dia, etc ... de um Dateobjeto. Btw Calendário método de componentes é mais apropriado para um único componente
Leo Dabus
@LeoDabus o opcional é propagada porque o DateComponents.yearacessor éInt?
NoodleOfDeath
1
você pode usar o método do componente Calendário, que retorna não opcional. Você também pode forçar a desembrulhar. Isso nunca falhará. Mas eu iria ficar com o método dos elementos de um único componente
Leo Dabus
@LeoDabus atualizado para usar o componentmétodo para esses assessores
NoodleOfDeath
2

somente para data em 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
fonte
1
Apenas uma observação, ao usar o NSDateFormatter, esses são objetos caros para criar; portanto, você pode usar um getter lento para reutilizar o mesmo NSDateFormatter se estiver usando esse código em uma tabela ou coleção ou algo assim. Os estilos e o formato podem ser alterados trivialmente onde necessário, sem afetar o desempenho, tanto quanto recriá-los onde quer que sejam necessários. Felicidades.!
jcpennypincher
2

Swift 5

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

e função de chamada printTimestamp ()

KRS
fonte
1

Você pode criar uma extensão em Date , assim poderá chamá-la facilmente em outros arquivos. Aqui está um exemplo de uma extensão de data que usa uma propriedade computada.

Ele será impresso: "Hoje, 16:55"

extension Date {

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

        return formatter
    }
}
pcnick13
fonte
1

Você pode usar o Swift4 ou o Swift 5 abaixo, como:

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

saída como:

2020-03-02
Enamul Haque
fonte
0

Caso você precise formatar a resposta de uma maneira específica, você pode facilmente usar esse método, o padrão = "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)
   }
}

Agora é possível obter a data de hoje usando

Date().today() or Date().today("dd/MM/yyyy") 
king_T
fonte
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
fonte
por favor, explique sua resposta.
MrMaavin 28/05/19
estende Data void integrada ... coloca a variável hora da data void no valor int, como também a variável minuto, e retorna hora e minuto como valor int. Depois disso, você pode usá-lo no código da maneira que desejar. Por exemplo, você pode chamar esses valores de DateComponents () - DateComponents.hour = Date.hour () - fornece o valor int do horário atual.
Vladimir Sukanica 29/05/19
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
fonte
0

Aqui está a extensão SWIFT para obter o horário atual de localização do 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)!
}

Obter tempo agora: -

Date().getGMTTimeDate()
Chathuranga Silva
fonte
0

Funciona com o Swift 5 (Xcode 10 e Xcode 11) (da França 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 você deseja exibir apenas a data, defina formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

Para exibir apenas horas, mude formatter.dateFormatpara

formatter.dateFormat = "HH:mm"

Não se esqueça de adicionar getCurrentDateTime()em viewDidLoad.

Benjamin Tourin
fonte
-1

Você pode obter do Dateformatter

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