Swift-iOS - Dates et heures dans un format différent
je travaille pour une application écrite dans swift et je veux manipuler les dates et les heures
let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .ShortStyle, timeStyle: .ShortStyle)
retourne
2/12/15, 11:27 PM
si je veux la date et l'heure dans un format différent,par exemple la date en format jj/mm/aa et l'heure au format 24h, sans AM et PM il y a une fonction que je peux l'utiliser ou je dois utiliser N Chaînes de réorganiser les différents éléments?
9 réponses
func convertDateFormater(date: String) -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
guard let date = dateFormatter.dateFromString(date) else {
assert(false, "no date from string")
return ""
}
dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let timeStamp = dateFormatter.stringFromDate(date)
return timeStamp
}
Éditer pour Swift 4
func convertDateFormatter(date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"//this your string date format
dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
dateFormatter.locale = Locale(identifier: "your_loc_id")
let convertedDate = dateFormatter.date(from: date)
guard dateFormatter.date(from: date) != nil else {
assert(false, "no date from string")
return ""
}
dateFormatter.dateFormat = "yyyy MMM HH:mm EEEE"///this is what you want to convert format
dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
let timeStamp = dateFormatter.string(from: convertedDate!)
return timeStamp
}
comme déjà mentionné, vous devez utiliser DateFormatter pour formater vos objets Date. La façon la plus simple de le faire est de créer une extension de date de propriété calculée en lecture seule.
Propriétés Calculées En Lecture Seule
une propriété calculée avec un getter mais aucun setter n'est connu comme un lecture seule propriété calculée. Lecture seule propriété calculée toujours renvoie une valeur, et peut être accédé par la syntaxe de point, mais ne peut pas être défini à un autre valeur.
Remarque:
Vous devez déclarer les propriétés calculées-y compris en lecture seule calculée propriétés-comme propriétés variables avec le mot-clé var, parce que leur la valeur n'est pas fixe. Le mot-clé let n'est utilisé que pour constant propriétés, pour indiquer que leurs valeurs ne peuvent pas être modifiés une fois qu'ils sont définies dans le cadre de l'instance de l'initialisation.
Vous pouvez simplifier la déclaration d'une lecture seule propriété calculée par retrait de l'obtenir mot-clé et ses accolades:
extension Formatter {
static let date = DateFormatter()
}
extension Date {
var europeanFormattedEn_US : String {
Formatter.date.calendar = Calendar(identifier: .iso8601)
Formatter.date.locale = Locale(identifier: "en_US_POSIX")
Formatter.date.timeZone = .current
Formatter.date.dateFormat = "dd/M/yyyy, H:mm"
return Formatter.date.string(from: self)
}
}
pour le convertir, Vous pouvez créer une autre propriété calculée en lecture seule mais comme extension de chaîne:
extension String {
var date: Date? {
return Formatter.date.date(from: self)
}
func dateFormatted(with dateFormat: String = "dd/M/yyyy, H:mm", calendar: Calendar = Calendar(identifier: .iso8601), defaultDate: Date? = nil, locale: Locale = Locale(identifier: "en_US_POSIX"), timeZone: TimeZone = .current) -> Date? {
Formatter.date.calendar = calendar
Formatter.date.defaultDate = defaultDate ?? calendar.date(bySettingHour: 12, minute: 0, second: 0, of: Date())
Formatter.date.locale = locale
Formatter.date.timeZone = timeZone
Formatter.date.dateFormat = dateFormat
return Formatter.date.date(from: self)
}
}
Utilisation:
let dateFormatted = Date().europeanFormattedEn_US //"29/9/2018, 16:16"
if let date = dateFormatted.date {
print(date.description(with:.current)) // Saturday, September 29, 2018 at 4:16:00 PM Brasilia Standard Time\n"\
date.europeanFormattedEn_US // "29/9/2018, 16:27"
}
let dateString = "14/7/2016"
if let date = dateString.toDateFormatted(with: "dd/M/yyyy") {
print(date.description(with: .current))
// Thursday, July 14, 2016 at 12:00:00 PM Brasilia Standard Time\n"
}
let dateFormatter = NSDateFormatter()
//the "M/d/yy, H:mm" is put together from the Symbol Table
dateFormatter.dateFormat = "M/d/yy, H:mm"
dateFormatter.stringFromDate(NSDate())
vous devrez aussi pouvoir utiliser la table si vous avez besoin de convertir une date qui est une chaîne de caractères en un NSDate.
let dateAsString = "02/12/15, 16:48"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "M/d/yyyy, H:mm"
let date = dateFormatter.dateFromString(dateAsString)
date actuelle heure de formater la chaîne:
let currentDate = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a"
let convertedDate: String = dateFormatter.string(from: currentDate) //08/10/2016 01:42:22 AM
si vous voulez utiliser la programmation orientée protocole (Swift 3)
1) Créer un Dateable protocole
protocol Dateable {
func userFriendlyFullDate() -> String
func userFriendlyHours() -> String
}
2) étendre la classe Date et mettre en oeuvre le protocole Dateable
extension Date: Dateable {
var formatter: DateFormatter { return DateFormatter() }
/** Return a user friendly hour */
func userFriendlyFullDate() -> String {
// Customize a date formatter
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
formatter.timeZone = TimeZone(abbreviation: "UTC")
return formatter.string(from: self)
}
/** Return a user friendly hour */
func userFriendlyHours() -> String {
// Customize a date formatter
formatter.dateFormat = "HH:mm"
formatter.timeZone = TimeZone(abbreviation: "UTC")
return formatter.string(from: self)
}
// You can add many cases you need like string to date formatter
}
3) Utilisez-le
let currentDate: Date = Date()
let stringDate: String = currentDate.userFriendlyHours()
// Print 15:16
Vous avez déjà trouvé NSDateFormatter
, il suffit de lire la documentation.
NSDateFormatter Classe De Référence
Pour les caractères de format de définitions
Voir:formatage ICU Dates et heures
Aussi:Champ Date SymbolTable..
j'ai utilisé la même approche que @iod07, mais comme extension. Aussi, j'ai ajouté quelques explications dans les commentaires pour comprendre comment il fonctionne.
en gros, il suffit de l'ajouter en haut ou en bas de votre contrôleur de vue.
extension NSString {
class func convertFormatOfDate(date: String, originalFormat: String, destinationFormat: String) -> String! {
// 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 String Date to NSDate
let dateFromString = dateOriginalFormat.dateFromString(date)
// Convert new NSDate created above to String with the good format
let dateFormated = dateDestinationFormat.stringFromDate(dateFromString!)
return dateFormated
}
}
Exemple
disons que vous voulez convertir "16 05 05"
"Thursday 05 May 2016"
et votre date est déclarée comme suit let date = "16 06 05"
alors appelez simplement call it with:
let newDate = NSString.convertFormatOfDate(date, originalFormat: "yy MM dd", destinationFormat: "EEEE dd MMMM yyyy")
j'Espère que ça aide !
Swift 3:
//This gives month as three letters (Jun, Dec, etc)
let justMonth = DateFormatter()
justMonth.dateFormat = "MMM"
myFirstLabel.text = justMonth.string(from: myDate)
//This gives the day of month, with no preceding 0s (6,14,29)
let justDay = DateFormatter()
justDay.dateFormat = "d"
mySecondLabel.text = justDay.string(from: myDate)
//This gives year as two digits, preceded by an apostrophe ('09, '16, etc)
let justYear = DateFormatter()
justYear.dateFormat = "yy"
myThirdLabel.text = "'\(justYear.string(from: lastCompDate))"
pour plus de formats, consultez ce lien à une table codingExplorer avec tous les formats disponibles. Chaque composante date a plusieurs options, par exemple:
Année:
- "y" - 2016 (dates de début comme l'an 1: "1")
- "aa" - 16 (année 1: "01"
- "yyy" - 2016 (année 1: "001")
- "aaaa" - 2016 (année 1: "0001")
quasiment tous les composant A 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 "m" minuscule est réservé à la minute. Il y a d'autres exceptions, donc regardez le lien!
let usDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "en-US"))
//usDateFormat now contains an optional string "MM/dd/yyyy"
let gbDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "en-GB"))
//gbDateFormat now contains an optional string "dd/MM/yyyy"
let geDateFormat = DateFormatter.dateFormat(FromTemplate: "MMddyyyy", options: 0, locale: Locale(identifier: "de-DE"))
//geDateFormat now contains an optional string "dd.MM.yyyy"
vous pouvez l'utiliser de la façon suivante pour obtenir le format courant depuis le périphérique:
let currentDateFormat = DateFormatter.dateFormat(fromTemplate: "MMddyyyy", options: 0, locale: Locale.current)