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?

33
demandé sur shim 2015-02-13 01:37:51

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
}
56
répondu idris yıldız 2018-04-06 19:33:03

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"
}
28
répondu Leo Dabus 2018-09-29 19:36:06
Date Champ Symbole Table 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.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)
12
répondu Jeremy Pope 2015-02-12 22:57:11

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

Plus De Formats Date Time

6
répondu Atif Mahmood 2017-09-18 15:59:50

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
4
répondu Ludovic 2017-02-14 14:12:45

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

3
répondu zaph 2015-02-12 22:40:46

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 !

3
répondu tsnkff 2016-05-06 12:10:48

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!

2
répondu Dave G 2016-10-10 11:46:31
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)
0
répondu mswyss 2017-04-02 09:36:46