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

Composants FMX Delphi Discussion :

DateTimeToString différent sous Windows et Android [Android]


Sujet :

Composants FMX Delphi

  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    1 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 1 790
    Points : 5 754
    Points
    5 754
    Par défaut DateTimeToString différent sous Windows et Android
    Bonjour à tous,

    Devant migrer une application développée par un tiers de Windows vers Android, je viens d'être piégé par le cas suivant :

    Le code ci-dessous semble être indépendant de l'OS cible mais donne en réalité 2 résultats différents sous Windows et Android. À un endroit de l'application, le codeur a voulu afficher une variable TDate selon le format défini par les paramètres régionaux de l'appareil (un "10/11/2012" français devenant par exemple un "10.11.2012" suisse) dans un label. Dans une autre partie de son code, il a repris la valeur affichée par le label pour en refaire un TDate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DateTimeToString(str,FormatSettings.ShortDateFormat, EncodeDate(myYear,myMonth,MyDay));
    Label1.text:=str;
     
    ...
     
    RefDate:=StrToDate(Label1.text);
    Sous Windows, une date "10/11/1900" est affichée dans le label comme "10/11/1900" et le StrToDate redonne une date "10/11/1900".
    Mais sous Android, on a... une date "10/11/1900" qui est affichée dans le label comme "10/11/00" et le StrToDate redonne une date "10/11/2000" !!!!!!!!!!!!!!!!!!!!!!


    On a donc un "DateTimeToString(str,FormatSettings.ShortDateFormat..." qui indique l'année sur 4 caractères sous Windows et seulement sur 2 sous Android en perdant dans le cas précis l'information du siècle.


    Est-ce que quelqu'un a une explication sur ce comportement différent et est-ce qu'il y a une solution simple pour forcer sous Android l'indication de l'année avec 4 caractères sans qu'il me soit nécessaire de revoir tout le traitement des dates de ce gentil codeur "windowien" ?

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Bonjour, ce n'est pas une différence de comportement, le format des dates est dépendant des paramètres de l'OS - ce qui permet de gérer les dates françaises et suisses - mais aussi les années sur 2 ou 4 chiffres.

    si tu fournis la date 10/11/00 à Delphi sous Windows, il te sortira aussi 10/11/2000
    si tu fournis la date 10/11/1900 à Delphi sous Android, il te sortira aussi 10/11/1900

    à mon sens le bug est dans le fait de passer la date dans une chaîne dont on ne sait rien pour espérer la relire sans qu'elle soit modifiée...or en passant à /00 tu pers l'informations du siècle et tu te retrouves forcément dans une incertitude et potentiellement un décalage de 100 ans
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    1 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 1 790
    Points : 5 754
    Points
    5 754
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Bonjour, ce n'est pas une différence de comportement, le format des dates est dépendant des paramètres de l'OS - ce qui permet de gérer les dates françaises et suisses - mais aussi les années sur 2 ou 4 chiffres.

    si tu fournis la date 10/11/00 à Delphi sous Windows, il te sortira aussi 10/11/2000
    si tu fournis la date 10/11/1900 à Delphi sous Android, il te sortira aussi 10/11/1900
    Tu as tout à fait raison, mais mon questionnement se situe ailleurs (je me suis certainement mal exprimé).

    On a effectivement "DateTimeToString(str,FormatSettings.ShortDateFormat, EncodeDate(myYear,myMonth,MyDay));" qui dépend des paramètres régionaux de l'OS (c'est ce que l'on veut pour que l'affichage des dates s'adapte automatiquement au format spécifique du pays concerné).

    Ma question est de savoir si l'on peut via le code forcer le mode d'affichage de l'année sur 4 caractères sous l'OS Android sans pour autant perdre le reste des paramètres régionaux qui indiquent le format de date (Des "/" comme séparateur pour une date en France, des "." comme séparateur pour une date en Suisse, l'ordre des jours, mois, année différent pour les USA, etc) . On pourrait bien remplacer "FormatSettings.ShortDateFormat" (qui se réfère au format de date défini dans l'OS) par un format sur mesure du genre "dd / mm / yyyy" mais dans ce cas on perd l'adaptation du format de date en fonction des régions (tu auras toujours ta date affichée "10/12/1900" quelque soit les paramètres régionaux de l'OS).


    Citation Envoyé par Paul TOTH Voir le message
    à mon sens le bug est dans le fait de passer la date dans une chaîne dont on ne sait rien pour espérer la relire sans qu'elle soit modifiée...or en passant à /00 tu pers l'informations du siècle et tu te retrouves forcément dans une incertitude et potentiellement un décalage de 100 ans
    Tu as encore raison. En l'occurrence, l'idée de faire du TDate > TString > TDate n'est pas l'idée la plus brillante qu'ait eu l'ancien développeur. Pour ma part, soit je vire cette méthode de faire, ce qui va entraîner pas mal de temps (que je n'ai évidemment pas), soit je trouve une solution simple et rapide pour forcer une date à 4 caractères dans le string.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Anselme45 Voir le message
    Tu as encore raison. En l'occurrence, l'idée de faire du TDate > TString > TDate n'est pas l'idée la plus brillante qu'ait eu l'ancien développeur. Pour ma part, soit je vire cette méthode de faire, ce qui va entraîner pas mal de temps (que je n'ai évidemment pas), soit je trouve une solution simple et rapide pour forcer une date à 4 caractères dans le string.
    alors je ne pense pas qu'ajouter un champ Date dans la fiche contenant Label1 soit d'une complexité insurmontable...mais si tu veux continuer à faire des choses pas propres, tu peux sans doute remplace "yy" par "yyyy" dans le format date (StringReplace), en vérifiant avant qu'il ne contient pas déjà "yy" (Pos) sinon tu vas avoir "yyyyyyyy".
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    1 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 1 790
    Points : 5 754
    Points
    5 754
    Par défaut
    Merci à Paul Toth pour son aide.

    Je réponds à ma propre question en espérant que cela puisse servir à quelqu'un:

    Ma question est de savoir si l'on peut via le code forcer le mode d'affichage de l'année sur 4 caractères sous l'OS Android sans pour autant perdre le reste des paramètres régionaux qui indiquent le format de date (Des "/" comme séparateur pour une date en France, des "." comme séparateur pour une date en Suisse, l'ordre des jours, mois, année différent pour les USA, etc)
    1° Récupérer le format de date défini par les paramètres régionaux de l'appareil Android:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var MyDateFormat: TFormatSettings;
    ...
     
     MyDateFormat:=TFormatSettings.Create;

    2° Modifier le format de date récupéré en s'assurant d'avoir l'année définie avec 4 caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if pos('yyyy', MyDateFormat.ShortDateFormat)<=0
      then MyDateFormat.ShortDateFormat:=StringReplace(MyDateFormat.ShortDateFormat, 'yy', 'yyyy', []);

    3° Quand on utilise ensuite un fonction permettant de transformer une date en string, on utilise le format MyDateFormat

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Android] Comportement différent sur windows et android pour les chaine de caractères
    Par Gouyon dans le forum Composants FMX
    Réponses: 7
    Dernier message: 18/09/2021, 14h21
  2. [Lazarus] Comportement de la souris différent sous Windows et sous Linux
    Par ChPr dans le forum Lazarus
    Réponses: 4
    Dernier message: 28/09/2014, 11h41
  3. Réponses: 0
    Dernier message: 30/05/2013, 09h46
  4. Réponses: 4
    Dernier message: 04/10/2011, 11h28
  5. Execution différente sous Windows et UNIX
    Par SpongeBob dans le forum C
    Réponses: 4
    Dernier message: 19/01/2010, 09h19

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