IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Sydney aurait-il un problème avec les dates?


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut Sydney aurait-il un problème avec les dates?
    Bonjour

    Est-ce que l'un d'entre vous pourrait tester ces 3 lignes de code dans Sydney svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      S: string;
      Dte: TDatetime;
    begin
      S := 'Bonjour le monde';
      if System.DateUtils.TryISO8601ToDate(S, Dte) then
        ShowMessage('C''est une date');
    Chez moi ça donne:

    ---------------------------
    Notification des exceptions du débogueur
    ---------------------------
    Le projet Project2.exe a déclenché la classe d'exception EConvertError avec le message 'Aucun argument pour le format 'Chaîne date incorrecte : %s %s''.
    ---------------------------
    Arrêter Continuer Aide
    ---------------------------

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Sans tester, je dirais qu'il suffit de regarder le code
    le CreateFmt de l'exception ne doit pas passer assez de valeur

    vérifie rtl\common\System.RTLConsts.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      { System.DateUtils }
      SInvalidDateString = 'Invalid date string: %s';
      SInvalidTimeString = 'Invalid time string: %s';
      SInvalidOffsetString = 'Invalid time Offset string: %s';
    vérifie rtl\common\fr\System.RTLConsts.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      { System.DateUtils }
      SInvalidDateString = 'Chaîne date incorrecte : %s %s';
      SInvalidTimeString = 'Chaîne heure incorrecte*: %s';
      SInvalidOffsetString = 'Chaîne décalage horaire incorrecte*: %s';
    Seattle contient le code ci-dessus mal localisé en FR
    Faut modifier rtl\common\fr\System.RTLConsts.pas (ou installer un patch si il existe)
    gros foirage de l'intégration de la traduction avec trop de %s ou alors ces *

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Si même ce genre de fonction qui existe depuis des lustres n'est pas vérifiée, ça va devenir pénible. :-)

    Modifier le source de Delphi, c'est pas vraiment dans mes habitudes, alors je me débrouillerai avec un regex.

    Merci pour ta réponse

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Il faut croire que le développeur a désactivé les "notifications sur les exceptions du langage".

    Mais cette erreur n'apparaitra pas hors débogueur et TryISO8601ToDate retournera faux comme il se doit même si l'exception originale (conversion) est remplacée par la nouvelle (arguments)

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 202
    Points : 41 443
    Points
    41 443
    Billets dans le blog
    63
    Par défaut
    Il faut croire que cela n'aurait pas été signalé ! Il faut dire que TryISO8601ToDate j'avoue ne pas avoir utilisé.
    En tout cas s'il s'agit d'un erreur de localisation vite le signaler pour que la 10.4.2 le prenne en compte (quoique ...)

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Si même ce genre de fonction qui existe depuis des lustres n'est pas vérifiée, ça va devenir pénible. :-)
    Modifier le source de Delphi, c'est pas vraiment dans mes habitudes, alors je me débrouillerai avec un regex.
    Pour les Consts de ressource, je me generais pas, surtout que gérer une langue non native de Delphi, faut le faire soi-même
    En D7, j'ai plusieurs fois changer les sources du SOAP (pas l'officiel, j'ajoutais une copie dans le projet)

    Pour l'ISO8601, essaye ce code TSLTISO8601DateTime.TryStringToDate

    c'est ultra simpliste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    //------------------------------------------------------------------------------
    class function TSLTISO8601DateTime.TryStringToDate(const S: string; out ADate: TDate; AExtendedFormat: Boolean = True): Boolean;
    var
      lFormatSettings: TFormatSettings;
      SBase: string;
      StartPos: Integer;
      ReverseRead: PChar;
      Year, Month, Day: Word;
      ResultD: TDateTime;
    begin
      Result := False;
      ADate := 0;
     
      lFormatSettings := TFormatSettings.Create();
      if AExtendedFormat then
      begin
        lFormatSettings.DateSeparator := SEPARATOR_DATE_EXTENDED;
        lFormatSettings.ShortDateFormat := FORMAT_DATE_EXTENDED;
        if TryStrToDate(S, ResultD, lFormatSettings) then
        begin
          ADate := ResultD;
          Result := True;
        end;
      end
      else
      begin
        if Length(S) >= LENGTH_DATE_BASE then
        begin
          StartPos := 1;
          ScanToNumber(S, StartPos);
          SBase := Copy(S, StartPos, LENGTH_DATE_BASE);
          if Length(SBase) = LENGTH_DATE_BASE then
          begin
            ReverseRead := PChar(SBase);
            Inc(ReverseRead, LENGTH_DATE_BASE);
     
            try
              Day := ReadWord(ReverseRead, LENGTH_DATE_DAY_BASE);
              Month := ReadWord(ReverseRead, LENGTH_DATE_MONTH_BASE);
              Year := ReadWord(ReverseRead, LENGTH_DATE_YEAR_BASE);
     
              if TryEncodeDate(Year, Month, Day, ResultD) then
              begin
                ADate := ResultD;
                Result := True;
              end
            except
              on E: Exception do
                {$IFDEF DEBUG_SLT_ISO8601}OutputDebugISO8601('TryStringToDate : ' + E.Message);{$ENDIF DEBUG_SLT_ISO8601}
            end;
          end;
        end;
      end;
    end;

  7. #7
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    Pour moi rien de choquant : l'exception n'apparaît qu'en débogage pas en dehors.

    La fonction renvoie bien true/false et la date lorsqu'elle arrive à la traiter depuis la chaine de caractères.

    C'est donc conforme aux specs pas la peine de signaler quoi que ce soit sur QA sur ce coup là.

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 202
    Points : 41 443
    Points
    41 443
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par pprem Voir le message
    Pour moi rien de choquant : l'exception n'apparaît qu'en débogage pas en dehors.
    Pas d'accord Patrick, même si effectivement ce n'est qu'une exception de débogage il s'agit d'un bogue mineur dû à la localisation, facile à corriger alors pourquoi ne pas le faire et laisser trainer ça

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Citation Envoyé par pprem Voir le message
    Pour moi rien de choquant
    Si quand même. Ici c'est plus ou moins identique par l'utilisation d'une fonction TryXXX qui intègre un gestion d'exception mais un appel à ISO8601ToDate retournera une erreur incohérente.

  10. #10
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Merci Shaï ... mais ...

    Je lis un fichier Excel qui me renvoie des valeurs du style '2012-01-01T00:00:00+01:00' et je pense que le format ne correspond pas à ce qu'attend ton compte que je viens d'essayer.
    En fait, si j'utilise la fonction pour les dates, il ne comprend pas que c'est une date.
    Si j'utilise la version pour Datetime, il accepte n'importe qu'elle valeur numérique. PAr exemple, il a considéré que 13 est correct et le transforme en TDatetime.

    Ton code est sans contexte bon, mais il semble que le format renvoyé par Excel soit un peu différent su standard.

  11. #11
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Si quand même. Ici c'est plus ou moins identique par l'utilisation d'une fonction TryXXX qui intègre un gestion d'exception mais un appel à ISO8601ToDate retournera une erreur incohérente.
    L'exemple ici ne propose pas de date, donc c'est normal que le résultat soit faux. pour moi l'exception est une gêne en débogage mais c'est ni la première, ni la dernière qu'on croisera.

    Si la fonction fonctionne pour une date cohérente, y a pas de soucis.

    Si la fonction ne fonctionne pas lorsqu'on lui passe une date, là y a problème et un ticket d'incident doit être ouvert avec l'exemple.

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Citation Envoyé par pprem Voir le message
    Si la fonction fonctionne pour une date cohérente, y a pas de soucis.
    Et dans ce cas, il n'y aurait pas besoin de contrôle de validité/gestionnaire d'exception

    Si maintenant j'aimerais gérer moi-même les incohérences :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
      D := ISO8601ToDate(...);
    except
      on E:EDateTimeException do ...
    end;
    ça ne marchera pas.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Oh, ce que je lis me déplait au plus point !
    C'est quoi ce laxisme ?! l'exception porte sur une erreur de la fonction Format avec un message incorrect

    le véritable problème comme le souligne Andnotor c'est la fonction ISO8601ToDate et non TryISO8601ToDate
    ISO8601ToDate n'est plus conforme au spec puisqu'elle retourne la mauvaise exception


    @Papy214
    Pour '2012-01-01T00:00:00+01:00' comme ça contient T, je dirais qu'il faut utiliser TSLTISO8601DateTime.StringToDateTime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uses SLT.Common.DateUtilsEx;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(
        FormatDateTime('dddd dd mmmm yyyyy à hh:nn:ss',
          TSLTISO8601DateTime.StringToDateTime('2012-01-01T00:00:00+01:00')));
    end;
    affiche

    [Window Title]
    Iso8601

    [Content]
    dimanche 01 janvier 2012 à 00:00:00

    [OK]
    Par contre, je n'ai pas traité la partie fuseau horaire, mais je pense que l'on peut facilement ajouter ce critère en exploitant le séparateur +

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 202
    Points : 41 443
    Points
    41 443
    Billets dans le blog
    63
    Par défaut
    Je reviens à la charge car la correction me semble simple, comme l'a déjà indiqué ShaiLeTroll

    <Sources>\RTL\Common\FR\System.RTLConsts.pas , ligne 558
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      // SInvalidDateString = 'Chaîne date incorrecte : %s %s';
    SInvalidDateString = 'Chaîne date incorrecte : %s';
    l'erreur n'est, hélas, pas récente j'ai pu vérifié dans Seattle, Rio. Cette exception n'existait pas avec XE4.

    en nota bene @ShaiLeTroll.B. le * de SInvalidTimeString = 'Chaîne heure incorrecte*: %s'; a dû être ôté par un patch par je ne l'ai pas trouvé

    Je persiste à écrire qu'il s'agit d'un bogue mineur, d'origine, au niveau des localisations

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Sur Seattle, j'espère que cela a été corrigé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try
      D := ISO8601ToDate('');
    except
      on E:EDateTimeException do ShowMessage('Vide');
    end;
    Résultat : Violation d'Accès !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ---------------------------
    demo_client_******_d10
    ---------------------------
    Access violation at address 0000000000570BA4 in module 'demo_client_******_d10.exe'. Read of address 0000000000000000.
    ---------------------------
    OK   
    ---------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LNegativeDate := (DateString[Low(string)] = '-');
    Le test sur la longueur minimale de DateString est effectué après avoir tenté de récupérer le premier caractère

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 202
    Points : 41 443
    Points
    41 443
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Je persiste à écrire qu'il s'agit d'un bogue mineur, d'origine, au niveau des localisations
    Cette erreur a été corrigée dans la version 12, il suffisait de la signaler sur le portail qualité, la proximité de sortie de la nouvelle version a fait le reste

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/11/2005, 11h43
  2. problème avec les dates!!
    Par JauB dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 09h16
  3. problème avec les dates nulles
    Par shingo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/09/2005, 12h32
  4. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo