Swift – iOS – Dates et heures en différents formats

Je travaille pour une application écrite en swift et je veux manipuler les dates et les heures

let timestamp = NSDateFormatter.localizedSsortingngFromDate(NSDate(), dateStyle: .ShortStyle, timeStyle: .ShortStyle) 

résultats

 2/12/15, 11:27 PM 

si je veux la date et l'heure dans un format différent, par exemple la date dans un format européen comme jj / mm / aa et les heures dans le format 24h sans AM et PM il y a une fonction que je peux utiliser ou je dois utiliser N Cordes pour réorganiser les différents éléments?

 func convertDateFormater(date: Ssortingng) -> Ssortingng { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" dateFormatter.timeZone = NSTimeZone(name: "UTC") guard let date = dateFormatter.dateFromSsortingng(date) else { assert(false, "no date from ssortingng") return "" } dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm" dateFormatter.timeZone = NSTimeZone(name: "UTC") let timeStamp = dateFormatter.ssortingngFromDate(date) return timeStamp } 

Comme déjà mentionné, vous devez utiliser NSDateFormatter pour formater vos objects NSDate. La méthode la plus simple consiste à créer une extension NSDate de propriété calculée en lecture seule.

properties calculées en lecture seule

Une propriété calculée avec un getter mais pas setter est connue comme une propriété calculée en lecture seule. Une propriété calculée en lecture seule renvoie toujours une valeur et peut être accessible via la syntaxe à points, mais ne peut pas être définie sur une valeur différente.

REMARQUE

Vous devez déclarer les propriétés calculées, y compris les propriétés calculées en lecture seule, en tant que propriétés de variable avec le mot key var, car leur valeur n'est pas corrigée. Le mot key let n'est utilisé que pour les propriétés constantes, pour indiquer que leurs valeurs ne peuvent pas être modifiées une fois qu'elles ont été définies dans le cadre de l'initialisation de l'instance.

Vous pouvez simplifier la déclaration d'une propriété calculée en lecture seule en supprimant le mot key get et ses accolades:

 extension NSDateFormatter { convenience init(dateFormat: Ssortingng) { self.init() self.dateFormat = dateFormat } } extension NSDate { struct Formatter { static let custom = NSDateFormatter(dateFormat: "dd/M/yyyy, H:mm") } var customFormatted: Ssortingng { return Formatter.custom.ssortingngFromDate(self) } } 

Pour le reconvertir, vous pouvez créer une autre propriété calculée en lecture seule, mais en tant qu'extension de string:

 extension Ssortingng { var asDate: NSDate? { return NSDate.Formatter.custom.dateFromSsortingng(self) } func asDateFormatted(with dateFormat: Ssortingng) -> NSDate? { return NSDateFormatter(dateFormat: dateFormat).dateFromSsortingng(self) } } 

Usage:

 let ssortingngFromDate = NSDate().customFormatted // "14/7/2016, 2:00" if let date = ssortingngFromDate.asDate { // "Jul 14, 2016, 2:00 AM" print(date) // "2016-07-14 05:00:00 +0000\n" date.customFormatted // "14/7/2016, 2:00" } "14/7/2016".asDateFormatted(with: "dd/MM/yyyy") // "Jul 14, 2016, 12:00 AM" 

Comme Zaph l'a déclaré, vous devez suivre la documentation. Certes, il peut ne pas être le plus simple par rapport à d'autres references de class. La réponse courte est, vous utilisez la table de symbole de champ de date pour comprendre quel format vous voulez. Une fois que vous faites:

 let dateFormatter = NSDateFormatter() //the "M/d/yy, H:mm" is put together from the Symbol Table dateFormatter.dateFormat = "M/d/yy, H:mm" dateFormatter.ssortingngFromDate(NSDate()) 

Vous devrez également être en mesure d'utiliser la table si vous devez convertir une date qui est une string en NSDate.

 let dateAsSsortingng = "02/12/15, 16:48" let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "M/d/yyyy, H:mm" let date = dateFormatter.dateFromSsortingng(dateAsSsortingng) 

Si vous voulez utiliser la programmation orientée protocole (Swift 3)

1) Créer un protocole Dateable

 protocol Dateable { func userFriendlyFullDate() -> Ssortingng func userFriendlyHours() -> Ssortingng } 

2) Étendre la class Date et implémenter le protocole Dateable

 extension Date: Dateable { var formatter: DateFormatter { return DateFormatter() } /** Return a user friendly hour */ func userFriendlyFullDate() -> Ssortingng { // Customize a date formatter formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" formatter.timeZone = TimeZone(abbreviation: "UTC") return formatter.ssortingng(from: self) } /** Return a user friendly hour */ func userFriendlyHours() -> Ssortingng { // Customize a date formatter formatter.dateFormat = "HH:mm" formatter.timeZone = TimeZone(abbreviation: "UTC") return formatter.ssortingng(from: self) } // You can add many cases you need like ssortingng to date formatter } 

3) Utilisez-le

 let currentDate: Date = Date() let ssortingngDate: Ssortingng = currentDate.userFriendlyHours() // Print 15:16 

Heure actuelle de la string formée:

 let currentDate = Date() let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a" let convertedDate: Ssortingng = dateFormatter.ssortingng(from: currentDate) //08/10/2016 01:42:22 AM 

Plus de formats de date et d'heure

J'ai utilisé une approche similaire à @ iod07, mais en tant qu'extension. Aussi, j'ai ajouté quelques explications dans les commentaires pour comprendre comment cela fonctionne.

Fondamentalement, il suffit d'append cela en haut ou en bas de votre controller de vue.

 extension NSSsortingng { class func convertFormatOfDate(date: Ssortingng, originalFormat: Ssortingng, destinationFormat: Ssortingng) -> Ssortingng! { // Orginal format : let dateOriginalFormat = NSDateFormatter() dateOriginalFormat.dateFormat = originalFormat // in the example it'll take "yy MM dd" (from our call) // Destination format : let dateDestinationFormat = NSDateFormatter() dateDestinationFormat.dateFormat = destinationFormat // in the example it'll take "EEEE dd MMMM yyyy" (from our call) // Convert current Ssortingng Date to NSDate let dateFromSsortingng = dateOriginalFormat.dateFromSsortingng(date) // Convert new NSDate created above to Ssortingng with the good format let dateFormated = dateDestinationFormat.ssortingngFromDate(dateFromSsortingng!) return dateFormated } } 

Exemple

Disons que vous voulez convertir "16 05 05" en "Thursday 05 May 2016" et que votre date est déclarée comme suit let date = "16 06 05"

Ensuite, appelez l'appeler avec:

 let newDate = NSSsortingng.convertFormatOfDate(date, originalFormat: "yy MM dd", destinationFormat: "EEEE dd MMMM yyyy") 

J'espère que cela aide !

Vous avez déjà trouvé NSDateFormatter , lisez simplement la documentation dessus.

Référence de la class NSDateFormatter

Pour les définitions de caractères de format
Voir: Dates et heures de formatting des unités de soins intensifs
Aussi: Date Field SymbolTable. .

Swift 3:

 //This gives month as three letters (Jun, Dec, etc) let justMonth = DateFormatter() justMonth.dateFormat = "MMM" myFirstLabel.text = justMonth.ssortingng(from: myDate) //This gives the day of month, with no preceding 0s (6,14,29) let justDay = DateFormatter() justDay.dateFormat = "d" mySecondLabel.text = justDay.ssortingng(from: myDate) //This gives year as two digits, preceded by an apostrophe ('09, '16, etc) let justYear = DateFormatter() justYear.dateFormat = "yy" myThirdLabel.text = "'\(justYear.ssortingng(from: lastCompDate))" 

Pour plus de formats, consultez ce lien vers une table codingExplorer avec tous les formats disponibles. Chaque composant date a plusieurs options, par exemple:

An:

  • "y" – 2016 (les premières dates comme l'année 1 seraient: "1")
  • "yy" – 16 (année 1: "01"
  • "yyy" – 2016 (année 1: "001")
  • "yyyy" – 2016 (année 1: "0001")

Presque tous les composants ont 2-4 options, en utilisant la première lettre pour exprimer le format (le jour est "d", l'heure est "h", etc). Cependant, le mois est un «M» majuscule, parce que le minuscule «m» est réservé aux minutes. Il y a cependant d'autres exceptions, alors consultez le lien!

 let usDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "en-US")) //usDateFormat now contains an optional ssortingng "MM/dd/yyyy" let gbDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "en-GB")) //gbDateFormat now contains an optional ssortingng "dd/MM/yyyy" let geDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "de-DE")) //geDateFormat now contains an optional ssortingng "dd.MM.yyyy" 

Vous pouvez l'utiliser de la manière suivante pour get le format actuel de l'appareil:

 let currentDateFormat = DateFormatter.dateFormat(fromTemplate: "MMddyyyy", options: 0, locale: Locale.current)