Je veux juste comparer deux dates... :((

Bonsoir à  tous,


 


comment (sans écrire 30 lignes de codes) puis-je faire mon if ??


 


La première date vient de mon API Rest : MySql puis un getTimeStamp() en PHP. Mon timeinterval n'est pas depuis 1970 j'imagine...


 


La deuxième date vient d'un calcul dans mon algo.


 


Et surtout je veux comparer les jours et pas les heures !!


 


Réponses

  • J'ajouterais que :


    - quand je teste mon timestamp envoyé par le serveur (php donc) via timestamp.fr alors c'est juste mais swift utilise certainement un autre référentiel.


    ex : timestamp.fr avec 1512676329


    - le message Json est biensur décodé automatiquement par NSCoder, l'utilisation d'un type double au lieu de date serait-il utilse ? J'en doute...


     


    Merci.


  • Comment est créé ta variable à  partir du timestamp ?


    Ce code serait utile. Note que lorsque tu crées une date à  partir d'un timestamp, ce timestamp doit en général être un NSTimeInterval (double).


     


    Une date est précise, elle ne définit pas en soit un jour dans le temps, mais un moment de ce jour.


    Tu peux comparer selon certains degrés, une recherche rapide sur le net devrait te donner des solutions, notamment avec des NSCalendar.Unit.


  • Ma variable est alimentée à  partir d'un JsonDecode() vers une variable de type Date.


    J'ai mis le message du GET de l'API, le timestamp envoyé vient de PHP, ici serveur unix donc début = 1/1/1970 à  00:00:00.


    Malgrès cela, ma date se retrouve en 2048... 31 ans plus tard...


  • Dois-je comprendre que le timestamp de swift débute au 1/1/2001 alors que le timeStampUnix début au 1/1/1970 ?




  • Dois-je comprendre que le timestamp de swift débute au 1/1/2001 alors que le timeStampUnix début au 1/1/1970 ?




    C'est toujours mieux que le 11/09/2001, non ?


     


    Regarde ce lien : https://stackoverflow.com/questions/28016578/swift-how-to-create-a-date-time-stamp-and-format-as-iso-8601-rfc-3339-utc-tim

  • MachaonMachaon Membre
    décembre 2017 modifié #7

    ::)  ::)


    Je m'en suis sorti avec peu de code finalement... mais c'est lourd de perdre 2 heures pour comparer deux dates...  >:(



    self.suiviEleve.agendaJoursTravaille.forEach { (agjt : AgendaJoursTravaille) in
    dateFormatterPrint.dateFormat = "d/MM/yyyy"
    if (dateFormatterPrint.string(from:Date(timeIntervalSince1970: agjt.DateHeureCreation.timeIntervalSinceReferenceDate)) == dateFormatterPrint.string(from:date)) {
    icon = FontAwesome.fromCode("fa-music")
    iconColor = UIColor.black
    } else {
    icon = FontAwesome.fromCode("fa-close");
    iconColor = UIColor.lightGray
    }
    }

    à  base de :


    - je ramène ma date au bon timeStamp


    - et de dateFormatter pour comparer deux string


     


    pas sur que cela soit du code d'expert swift quand même...  :o


  • Joanna CarterJoanna Carter Membre, Modérateur
    Faut pas comparer les dates comme strings.


    Utilises plutôt DateComponents https://developer.apple.com/documentation/foundation/datecomponents


  • Faut pas comparer les dates comme strings.


    Utilises plutôt DateComponents https://developer.apple.com/documentation/foundation/datecomponents




     


    Oui mais dans ce cas, je veux comparer les jours et pas les heures...

  • LarmeLarme Membre
    décembre 2017 modifié #10

    C'est marqué dans la documentation de NSDate (dont s'inspire grandement Date) :



    NSDate objects encapsulate a single point in time, independent of any particular calendrical system or time zone. Date objects are immutable, representing an invariant time interval relative to an absolute reference date (00:00:00 UTC on 1 January 2001).



    C'est normal, cela a toujours été comme cela. C'est pour ça que je demandais le code d'initialisation de ta date.

     

    Pourrais-tu nommer tes variables en commençant avec une minuscule, cela fait parti des conventions (camelCase).


     


    Comme l'a dit le Nounours, ne compare pas des dates "String". Surtout pas comme tu l'as fait. Il y a certains formats qui rendent la plupart des comparaisons basiques (earlier/later, etc.) possibles (notamment un ordre d'apparition de la plus grande unité à  la plus petite), mais c'est casse-gueule je trouve, et tu as déjà  un objet de type Date (le DateFormatter est consommateur en ressources).

     

    Avant iOS8 et les nouveautés de NSCalendar, j'aurais fait :
    NSDateComponents, avec tous les flags de années à  jour.

    Et je les aurais comparés.

     

    Depuis, il y a les méthode très sympas :
    func compare(Date, to: Date, toGranularity: Calendar.Component)
    func isDate(Date, equalTo: Date, toGranularity: Calendar.Component)
    func isDate(Date, inSameDayAs: Date)


    Si je les avais codées (j'ai sûrement dû par le passé le faire):

    La dernière appelle la deuxième avec en paramètre today et en granularity NSCalendar.Unit.day.

    La deuxième appelle la première avec un check the sur le ComparisonResult retourné égal ou non ) .orderSame.


  • Ah oui en effet, c'es bcp mieux. ça marche nickel, merci pour ton aide.


Connectez-vous ou Inscrivez-vous pour répondre.