2017-10-18 1 views
0

Je crée des objets dans une boucle for et j'ai besoin d'une date et d'une heure de création spécifiques pour pouvoir dire dans quel ordre ils ont été créés. Je dois aussi enregistrer ce dateTime comme String et être toujours capable d'obtenir l'ordre de création de celui-ci.
Est-ce possible?Date de création d'objet spécifique et heure

Je comprends comment obtenir une date et une heure lorsque l'objet est créé, mais il n'est pas suffisamment spécifique lorsqu'il est converti en chaîne.

Actuellement, j'ai juste une petite extension pour Date:

extension Date { 
    func currentDateTimeAsString() -> String { 
     let date = Date() 
     let formatter = DateFormatter() 
     formatter.dateFormat = "HH:mm dd/MM/yyyy" 

     return formatter.string(from: date) 
    } 
} 

Mais ceci est évidemment pas assez précis, et je ne pense pas que l'ajout de millisecondes au temps va aider beaucoup non? Je comprends qu'il y a des façons de contourner cela en ajoutant count etc aux objets afin que je puisse l'utiliser pour obtenir la commande, mais je sais si j'utilise Date avant de le convertir en une chaîne, il va le commander correctement, donc il Il y a des informations qui s'y cachent que j'ai besoin de convertir en chaîne.

+0

Ajoutez du code pour montrer ce que vous faites maintenant. –

+0

J'ai ajouté mon code actuel, mais je ne suis pas sûr de sa grande utilisation :) – Wazza

+0

Si vous voulez avoir des temps uniques pour la création d'objets, vous avez probablement besoin de descendre en nanosecondes. Même dans ce cas, vous ne pouvez pas garantir qu'ils seront uniques. Peut-être ajouter un compteur ainsi que le temps. Trier en fonction du compteur seul. Affichage basé sur l'heure que vous collectez maintenant. –

Répondre

1

Vous pouvez écrire votre objet comme:

struct SomeData: CustomStringConvertible { 
    let dateTimeStr: String 
    private static var dateFormatter: DateFormatter { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "dd-MMM-yyyy HH:mm:ss.SSS" 
     return formatter 
    } 
    init() { 
     let creationDate = Date() 
     dateTimeStr = SomeData.dateFormatter.string(from: creationDate) 
    } 
    var creationDate: Date { 
     return SomeData.dateFormatter.date(from: dateTimeStr)! 
    } 
    var description: String {//just to print 
     return dateTimeStr 
    } 
} 

créer ensuite dans la boucle for comme:

var objArr = [SomeData]() 
for _ in 0...5 { 
    objArr.append(SomeData()) 
} 
print("\(objArr)") 

sortie: [18-Oct-2017 12: 50: 09,684, 18 -Oct-2017 12: 50: 09.690, 18-Oct-2017 12: 50: 09.692, 18-Oct-2017 12: 50: 09.696, 18-Oct-2017 12: 50: 09.699, 18-Oct-2017 12: 50: 09.704]

Comme vous pouvez le voir, ils sont déjà triés en fonction du temps de création.

Mais encore vous voulez trier à nouveau, le faire comme:

let sortedObjArr = objArr.sorted(by: { $0.creationDate < $1.creationDate }) 
print("\(sortedObjArr)") 

sortie: [18-Oct-2017 12: 50: 09,684, 18-Oct-2017 12: 50: 09,690 , 18 oct. 2017 12: 50: 09.692, 18 oct. 2017 12: 50: 09.696, 18 oct. 2017 12: 50: 09.699, 18 oct. 2017 12: 50: 09.704]

Si vous voulez inverser la commande, faites ceci:

let sortedObjArr = objArr.sorted(by: { $0.creationDate > $1.creationDate }) 
print("\(sortedObjArr)") 

Sortie: [18-Oct-2017 12: 50: 09.704, 18-Oct-2017 12: 50: 09.699, 18-Oct-2017 12: 50: 09.696, 18-Oct-2017 12: 50: 09.692 , 18 oct. 2017 12: 50: 09.690, 18 oct. 2017 12: 50: 09.684]

+0

Est-ce le plus de détails que vous pouvez obtenir sur Date? – Wazza

+0

Quels sont les détails que vous voulez mettre à jour? – D4ttatraya

+0

Comme dans le temps plus spécifique ou est millisecondes le plus petit? – Wazza