Comment obtenir l'heure actuelle en tant que datetime

265

Je viens de commencer avec la cour de récréation. J'essaie de créer une application simple.

J'ai créé un objet date comme celui-ci:

var date = NSDate()

Comment puis-je obtenir l'heure actuelle? Dans d'autres langues, je peux faire quelque chose comme ça:

var hour = date.hour

Mais je ne trouve pas de propriétés / méthodes comme ça. Je l' ai trouvé une méthode, dateWithCalendarFormat. Dois-je l'utiliser? Si c'est le cas, comment?

JOSEFtw
la source

Réponses:

390

Mise à jour pour Swift 3:

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

Je fais ça:

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

Voir la même question dans objective-c Comment obtenir des heures et des minutes de NSDate?

Comparé à la réponse de Nate, vous obtiendrez des chiffres avec celui-ci, pas des chaînes… choisissez votre choix!

noliv
la source
Bonjour, merci pour la réponse, par exemple si la minute est inférieure à deux caractères, comment puis-je la retourner avec deux caractères comme "04"
Yestay Muratov
2
@YestayMuratov Cette page Web pratique indique toutes les façons possibles de formater une date en utilisant NSDateFormatter dans Swift :) codingexplorer.com/…
Max
15
Il semble que la nouvelle version Swift (2) que vous devez utiliser quelque chose de similaire let components = calendar.components(.NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date), la barre oblique verticale ne puisse plus être utilisée ici.
Hola Soy Edu Feliz Navidad
5
let components = calendar.components(NSCalendarUnit.Year.union(NSCalendarUnit.Minute), fromDate: date)supprimé le supplément '.' avant NSCalendarUnit
cakes88
45
Swift 2.1: let components = calendar.components([ .Hour, .Minute, .Second], fromDate: date)
Obiwahn
184

Testé avec Swift 4

Obtention de la date et de l'heure actuelles

Vous pouvez obtenir la date et l'heure actuelles aussi simplement que ceci:

let currentDateTime = Date()

Cependant, Dateest un nombre à virgule flottante de 64 bits mesurant le nombre de secondes depuis la date de référence du 1er janvier 2001 à 00:00:00 UTC . Je peux voir ce nombre pour le datetime actuel en utilisant

Date().timeIntervalSinceReferenceDate

Au moment d'écrire ces lignes, il est revenu 497626515.185066, probablement pas exactement ce que vous recherchez. Continue de lire.

Création d'une autre date et heure

Méthode 1

Si vous connaissez le nombre de secondes avant ou après la date de référence, vous pouvez l'utiliser.

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

Méthode 2

Bien sûr, il serait plus facile d'utiliser des choses comme des années, des mois, des jours et des heures (plutôt que des secondes relatives) pour faire un Date. Pour cela, vous pouvez utiliser DateComponentspour spécifier les composants, puis Calendarpour créer la date. Le Calendardonne le Datecontexte. Sinon, comment pourrait-il savoir dans quel fuseau horaire ou calendrier l'exprimer?

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

Vous trouverez d'autres abréviations de fuseau horaire ici . Si vous laissez ce champ vide, la valeur par défaut consiste à utiliser le fuseau horaire de l'utilisateur.

Méthode 3

La manière la plus succincte (mais pas nécessairement la meilleure) pourrait être d'utiliser DateFormatter.

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

Les normes techniques Unicode montrent d' autres formats que DateFormattersupports.

Affichage de la date et de l'heure

Méthode 1

Si vous souhaitez simplement afficher certains composants de la date ou de l'heure, vous pouvez utiliser CalendarUnitpour spécifier les composants à partir desquels vous souhaitez extraire 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

Voir aussi cette réponse .

Méthode 2

La méthode 1 vous a donné les composants, mais ce serait beaucoup de travail de formater ces nombres pour chaque style, langue et région. Et vous n'en avez pas besoin. Cela a déjà été fait pour vous avec 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

Voici une suite du code ci-dessus qui montre plus d'options de formatage:

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

Gardez à l'esprit, cependant, que c'est pour l'anglais avec la région définie aux États-Unis. Pour les autres langues et régions, la mise en forme sera différente.

Une étude plus approfondie

Suragch
la source
58

Vous pouvez également utiliser la méthode pratique de NSDateFormatter, par exemple,

func printTimestamp() {
  let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .ShortStyle)
  print(timestamp)
}
printTimestamp() // Prints "Sep 9, 2014, 4:30 AM"
Scott Gardner
la source
2
La création d'un NSDateFormatter coûte cher. Vous devez le créer et le réutiliser.
Rog
3
Swift 3: let timestamp = DateFormatter.localizedString (from: Date (), dateStyle: .short, timeStyle: .short)
Brian
51

Swift facilite la création et l'utilisation d'extensions. Je crée un sharedCode.swiftfichier et y mets des énumérations, des extensions et d'autres éléments amusants. J'ai créé une NSDateextension pour ajouter des fonctionnalités typiques qui sont laborieuses et laides à taper encore et encore:

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

en utilisant cette extension, vous pouvez maintenant faire quelque chose comme:

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

Qui, à 11 h 51, écrirait:

(Heure actuelle = 11) (Minute actuelle = 51) (Chaîne de courte durée actuelle = 11:51 AM)

user2266987
la source
26

Réponse de 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
Matthieu Riegler
la source
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

PRODUCTION

2018-mai-01 10:41:31

Keshav Gera
la source
1
l'intervalle n'est jamais utilisé.
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 - Je ne sais pas exactement ce que signifie la question en obtenant l'heure actuelle (et l'heure) comme heure de date, mais j'espère que ce qui précède devrait expliquer suffisamment pour répondre à la question.

Charlie Seligman
la source
La réponse de SaRaVaNaN DM ci-dessus avait un «()» supplémentaire à la fin de Calendar.current.
Charlie Seligman
10

Avec Swift 5, Foundationoffre de nombreuses façons d'obtenir la valeur horaire d'un Dateobjet. Selon vos besoins, vous pouvez choisir l'un des quatre extraits de code Playground suivants .


#1. Utilisation de la Calendar dateComponents(_:from:)méthode

Calendara une méthode appelée dateComponents(_:from:). dateComponents(_:from:)a la déclaration suivante:

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

Renvoie tous les composants de date d'une date, à l'aide du fuseau horaire du calendrier.

Usage:

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. Utilisation de la Calendar component(_:from:)méthode

Calendara une méthode appelée component(_:from:). component(_:from:)a la déclaration suivante:

Renvoie la valeur d'un composant d'une date.

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

Usage:

import Foundation

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

# 3. Utilisation de la DateFormatter dateFormatpropriété

DateFormattera une propriété appelée dateFormat. dateFormata la déclaration suivante:

var dateFormat: String! { get set }

Chaîne de format de date utilisée par le destinataire.

Usage:

import Foundation

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

# 4. Utilisation de la Dateformatter setLocalizedDateFormatFromTemplate(_:)méthode

Dateformattera une méthode appelée setLocalizedDateFormatFromTemplate(_:). setLocalizedDateFormatFromTemplate(_:)a la déclaration suivante:

func setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)

Définit le format de date à partir d'un modèle en utilisant les paramètres régionaux spécifiés pour le récepteur.

Usage:

import Foundation

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

si vous avez juste besoin de l'heure du jour

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

Dans Swift 3,

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

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

Utilisation du formateur de date -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)

Mettre à jour la date et l'heure toutes les secondes

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)

    }

Remarque: DateAndTime dans le code Timer est le nom de la classe.

Kay Cee
la source
5

Je sais qu'il y a beaucoup de réponses mais je pense que la mienne peut être plus pratique pour beaucoup

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

la source
4

Vous pouvez essayer ceci

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

Maintenant, appelez cette méthode et recevez la date avec l'heure, la minute et la seconde

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

Vous pouvez utiliser en swift 4 ou 5 comme ci-dessous

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

Ouput sera comme ci-dessous

2019-12-20 09:40:08
Enamul Haque
la source
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
la source
ou même simplementDate().hour
NoodleOfDeath
1
@NoodleOfDeath bien sûr. Cela dépend si une référence à la date est nécessaire ou non.
Leo Dabus
Très vrai, et je suppose que pour toutes les utilisations intensives, vous voudriez utiliser la même variable de date lors de la génération de composants de date associés plutôt qu'une nouvelle génération pour chaque composant de date
NoodleOfDeath
3

Développant la solution épique et concise de noiiv , voici l'implémentation encore plus concise de Swift 3/4:

Swift 3/4

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

En outre, en étendant l'extension de Leo Dabus, nous pouvons avoir:

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 }

}

Et utilisez-le comme ceci:

let date = Date()
let (hour, minute) = (date.hour, date.minute)
NoodleOfDeath
la source
pas besoin de retourner une option lorsque vous obtenez quelque chose comme l'année, le mois, le jour, etc ... à partir d'un Dateobjet. La méthode du composant Btw Calendar est plus appropriée pour un composant unique
Leo Dabus
@LeoDabus facultatif est propagé parce que l' DateComponents.yearaccesseur estInt?
NoodleOfDeath
1
vous pouvez utiliser la méthode du composant Calendar qui renvoie non facultatif. Vous pouvez également forcer le déballage. Cela n'échouera jamais. Mais je m'en tiendrai à la méthode des composants à élément unique
Leo Dabus
@LeoDabus mis à jour pour utiliser la componentméthode pour ces accesseurs
NoodleOfDeath
2

pour seulement la date dans un format spécifique

    let dateFormatter1 = NSDateFormatter()
    dateFormatter1.dateStyle = .MediumStyle
    dateFormatter1.timeStyle = .NoStyle
    dateFormatter1.dateFormat = "dd-MM-yyyy"
    let date = dateFormatter1.stringFromDate(NSDate())
Zain Ullah Muhammad
la source
1
Juste une note, lorsque vous utilisez NSDateFormatter, ce sont des objets coûteux à créer, vous pouvez donc utiliser un getter paresseux pour réutiliser le même NSDateFormatter si vous utilisez ce code dans une table ou une collection ou quelque chose. Les styles et le format peuvent être modifiés de manière triviale là où cela est nécessaire sans affecter les performances autant que de les recréer là où ils sont nécessaires. À votre santé.!
jcpennypincher
2

Swift 5

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

et fonction d'appel printTimestamp ()

KRS
la source
1

Vous pouvez créer une extension sur Date, de cette façon, vous pouvez facilement l'appeler dans d'autres fichiers. Voici un exemple d'une extension de date qui utilise une propriété calculée.

Il l'imprimera: "Aujourd'hui, 16h55"

extension Date {

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

        return formatter
    }
}
pcnick13
la source
1

Vous pouvez utiliser Swift4 ou Swift 5 comme ci-dessous:

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

sortie comme:

2020-03-02
Enamul Haque
la source
0

Dans le cas où vous devez formater la réponse d'une manière particulière, vous pouvez facilement utiliser cette méthode, la valeur par défaut = "jj-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)
   }
}

L'obtention de la date d'aujourd'hui peut désormais être effectuée à l'aide de

Date().today() or Date().today("dd/MM/yyyy") 
king_T
la source
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
la source
veuillez expliquer votre réponse.
MrMaavin
il étend la date intégrée void ... il met la variable heure de void Date à la valeur int, comme aussi la variable minute, puis retourne heure et minute comme valeur int. Après cela, vous pouvez l'utiliser dans le code comme vous le souhaitez. Par exemple, vous pouvez alors appeler ces valeurs à partir de DateComponents () - DateComponents.hour = Date.hour () - il vous donne la valeur int de l'heure actuelle.
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
la source
0

Voici l' extension SWIFT pour obtenir l'heure de votre emplacement actuel (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)!
}

Obtenez maintenant le temps: -

Date().getGMTTimeDate()
Chathuranga Silva
la source
0

Fonctionne avec Swift 5 (Xcode 10 et Xcode 11) (depuis la 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 vous souhaitez afficher uniquement la date, définissez formatter.dateFormat

formatter.dateFormat = "EEEE dd MMMM YYYY"

Pour afficher uniquement les heures, passez formatter.dateFormatà

formatter.dateFormat = "HH:mm"

Ne pas oublier d'ajouter getCurrentDateTime()sur viewDidLoad.

Benjamin Tourin
la source
-1

Vous pouvez obtenir de Dateformatter

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