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

C# Discussion :

Format d une date dateTime


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut Format d une date dateTime
    Je récupère une variable de type Date a partir d’un control DateTime sous forme ‘jj/mm/aaaa’ ; j’enregistre ça dans une table (Base de données Access) ; mais j’ai constaté que la forme de la date change ; car dans la table elle devienne ‘mm/jj/aaaa’

  2. #2
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    c'est normal ,c'est la norme English pour écrire la date dans Access 'mm/jj/aaaa'.

    c'est quoi le probleme ? est ce que tu le récupères et l'affichage est faussé ?

  3. #3
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut
    exacte, comment faire pour la convertir en format jj/mm/aaaa ?

  4. #4
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Display using date format information from hr-HR culture
    DateTime thisDate = new DateTime(2008, 3, 15);
    DateTimeFormatInfo fmt = (new CultureInfo("fr-FR")).DateTimeFormat;
    Console.WriteLine(thisDate.ToString("dd/mm/yyyy", fmt));      // Displays 15.3.2008
    il y'a plusieurs exemples dans cette page

    y'a aussi msdn

  5. #5
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut
    ce que je cherche exactement: je récupère une date d'un control DateTime et puis la comparer avec autre date récupérer de la table (base de données)

  6. #6
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    donc c'est dans ton code c# tu faire une comparaison simple t'aura pas de problème vu que dans c# y'a le standard ,c'est dans sql que tu compares les deux dates ?

  7. #7
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut
    est ce que c possible de me donner un petit exemple???? je suis débutant

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 930
    Par défaut
    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
    using System;
    using System.Data;
    using System.Data.SqlClient;
     
    namespace MyNameSpace
    {
        public class Test
        {
            public Boolean SameDate(DateTime date)
            {
                using (SqlConnection connection = new SqlConnection("UneChaineDeConnexion"))
                {
                    /* Option 1 : Tester la date dans le programme */
                    using (SqlCommand command = new SqlCommand("SELECT ChampDate FROM UneTable WHERE Condition", connection))
                    {
                        connection.Open();
                        command.CommandTimeout = 0;
     
                        SqlDataReader reader = command.ExecuteReader();
                        if (reader.Read()) return (reader.GetDateTime(0) == date);
                        else return false;
                    }
     
                    /* Option 2 : Tester la date dans la base */
                    using (SqlCommand command = new SqlCommand("SELECT COUNT(1) FROM UneTable WHERE Condition AND ChampDate=@UneDate", connection))
                    {
                        connection.Open();
                        command.CommandTimeout = 0;
     
                        SqlParameter parameter = command.Parameters.Add("UneDate", SqlDbType.DateTime);
                        parameter.Value = date;
     
                        SqlDataReader reader = command.ExecuteReader();
                        if (reader.Read()) return (reader.GetInt32(0) > 0);
                        else return false;
                    }
                }
            }
        }
    }

  9. #9
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut
    merci pour l'exemple
    mais la date récupérée de la base possède le format : MM/DD/YYYY
    alors que le date que j'ai récupérée d'un contrôle DateTime est de format DD/MM/YYYY

    le système ne signal aucune erreur

    mais le résultat est faux

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 930
    Par défaut
    Citation Envoyé par lebfar Voir le message
    merci pour l'exemple
    mais la date récupérée de la base possède le format : MM/DD/YYYY
    alors que le date que j'ai récupérée d'un contrôle DateTime est de format DD/MM/YYYY

    le système ne signal aucune erreur

    mais le résultat est faux
    Tu es sûr d'avoir pris la méthode sans changer (à l'exception de la requête bien entendu) ?
    Si ça renvoie faux avec l'une ou l'autre option, c'est que la requete que tu as mise ne récupère pas la bonne donnée ou qu'elle ne correspond effectivement pas.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Par défaut
    Bonjour,

    Je pense que tu te focalise un peu trop sur le format de tes dates.
    Pour faire simple, un DateTime est un type et n'a pas de format à la base (je simplifie), c'est quand tu affiche la date du DateTime que tu lui applique un format afin qu'elle soit lisible et compréhensible par l'utilisateur.

    Si tu veux comparer 2 dates, il faut déjà qu'elle soit du même type (DateTime étant le plus facile pour les dates en c#), je ne serais pas étonné que tu ne compare pas 2 dates mais 2 chaines de caractères (je peux me tromper).
    Si tu regarde bien l’exemple de popo, c'est exactement ce qu'il fait, soit en convertissant la donnée venant de la base de données en DateTime (reader.GetDateTime(0)), soit en donnant à la base de données une donnée de type DateTime (SqlDbType.DateTime), mais pour que ça fonctionne, encore faut-il avoir une donnée de type date en base de données.

    Montre nous un peu ton code de comparaison des dates pour que l'on y voit plus clair.

    Bonne continuation.

  12. #12
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut
    je répète toujours, que je suis débutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //La requête d’enregistrement dans une  base de données Access  :
    cmd.CommandText = "INSERT INTO table (CodeF,[Date],…, …, …, …) VALUES ('" + CCode.Text + "',   #" + dateTimePicker1.Value.Date + "#  ,…,… , …,…)";
     
    //Je récupère une date      dateTimePicker1.Value.Date        sous le format  JJ/MM/AAAA
    //après enregistrement dans la table, je constate qu elle est sous le format MM/JJ/AAAA
     
    //La requête d’affichage 
    "SELECT  ……  where  condition1  and  (CommandeF.Date ) between #" + DateDebut2.Value + "# and #" + DateFin2.Value+ "#");
     
    //La date récupérée de la table  «CommandeF.Date »     sous format   : MM/JJ/AAAA
    //Les dates récupérées de l’IHM  « DateDebut2.Value »  sous format   : JJ/MM/AAAA
    autrement dit : 01/05/2014 saisie au clavier devient 05/01/2014 dans la table

  13. #13
    Membre expérimenté
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Par défaut
    Bonjour et bonne année ,

    Autant pour moi, je n'avais pas vu que tu étais sous Access, ce qui change un peu (beaucoup) la donne.
    N'ayant pas Access, je ne peux pas trop faire de test, mais je te propose une solution qui devrait fonctionner (enfin j'espère), mais qui n'est pas propre.
    Dans le cas de tes requêtes, essaye de forcer le format de tes dates.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDebut2.Value.Date.ToString("MM/dd/yyyy")
    Comme je le disais dans mon message précédent, tes dates sont bien 'transformée' en chaîne de caractères en utilisant le format locale ("JJ/MM/AAAA"), ensuite Access les récupère en utilisant le format "MM/JJ/AAAA".
    Bon, je ne vais pas épiloguer sur Access mais je te conseillerais fortement de passer par des requêtes paramétrées, plutôt que par de la concaténation de chaines de caractères pour construire tes requêtes, tu y gagnera grandement.
    Tu peux te baser sur l'exemple de popo (option 2) pour ça.

    Et tu peux également lire un peu la FAQ d'Access qui a une partie Date plutôt instructive.

    Bonne continuation.

  14. #14
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    une date que ca soit en c# ou dans access n'a pas de format de type jj mm ou autre
    c'est un format standard international de stockage sur 8 octets
    ce n'est que son affichage en string (donc par conversion) qui a un format (jj/mm/yyyy ou autre)

    quand tu passe de c# à access il ne faut pas convertir la date en string, et réciproquement ca peut amener à des erreurs
    il est possible de faire transiter la date au format date (8 octets) avec les OleDbParameter
    parce que si tu concatènes comme tu le fais, c# va transformer la date en string, et pour ce faire il demande à windows quel est le format (ceci est donc paramétrable et dépende la machine)
    il y a donc des chances que ca arrive dans un format autre que ce qu'access attend, car lui en recevant la date en string va être obligé de la convertir en date (si c'est bien une colonne de type date)

    il faut un code dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cmd.commandtext = "insert into table (col1, coldate) values (?col1, ?coldate)";
    cmd.parameters.Add("?col1").value = me.Textbox1.text;
    cmd.parameters.Add("?coldate").value = me.dtpicker1.date;
    ainsi il ne peut pas y avoir de problème
    et même si access t'affiches mm/dd/yyyy ce n'est pas un soucis, c'est lui qui converti les date en string de la sorte, tu peux faire ce que tu veux dans ton programme
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut
    de retour apres une semaine d'arrêt

    est ce que c'est possible d'etre encore pus clair dans ta réponse?? je suis débutant .
    merci a l'avance

  16. #16
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    il y a l'explication et le code qui va avec je ne vois pas comment être plus clair, peut être est-ce à toi de comprendre ou au moins précise ce que tu ne comprends pas

    quand on concatène une requete avec des valeurs dedans c'est un string qui est envoyé à la base de données
    mais on peut à la place mettre des variables dans ce string, et déclarer les paramètres et leurs valeurs, ainsi un string plus des paramètres sont envoyés à la base de données qui utilise ces variables typées
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre averti
    Inscrit en
    Février 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 29
    Par défaut
    voila une partie du code; avec ça l'enregistrement des dates dans la table respecte la forme 05-janv-2014

    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
    DateTime date_commande = new DateTime();
    CultureInfo culture = new CultureInfo("fr-FR");
    date_commande = DateTime.Parse(dateTimePicker1.Value.ToString(), culture); 
    // On met la date au format anglais
    if (dateTimePicker1.Value.Date.Day > 12)
    {
    date_commande = dateTimePicker1.Value;
    }
    else
    {
    culture = new CultureInfo("en-US"); // On crée le contexte de culture "en-US"
    date_commande = DateTime.Parse(dateTimePicker1.Value.ToString(), culture); // On met la date au format anglais
    }
     
    System.Data.OleDb.OleDbConnection conn1 = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source= DBK.mdb;");
    System.Data.OleDb.OleDbCommand cmd = new OleDbCommand();
    cmd.CommandType = System.Data.CommandType.Text;
     
    cmd.CommandText = "INSERT INTO CommandeF (Code,[Date], , , Obs1) VALUES ('" + CCode.Text + "',#" + date_com + "#  ,'" +     + "','" +     + "' , '" + CObs1.Text + "')";
     
    cmd.Connection = conn1;
    conn1.Open();
    cmd.ExecuteNonQuery();
     
    // recuperer le numero de commande  auto incrementer 
    …
    …
     
    conn1.Close();

  18. #18
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    je confirme, tu n'as rien compris à ce que j'ai dis
    par contre je ne peux plus rien pour toi...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  19. #19
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Au risque de répéter ce que 2 membres ont déjà dit, il faut utiliser les requêtes paramètrées. Voir Tuto.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  20. #20
    Membre expérimenté
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Par défaut
    Bonjour,

    Bon, Last Try.
    Il faut que tu oublie une bonne fois pour toute cette histoire de format de date, c'est juste là pour l'utilisateur.

    Voilà ce que pourrait être ton bloque de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    using (System.Data.OleDb.OleDbConnection cnx = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source= DBK.mdb;")) // Création de la connexion
    {
        using (System.Data.OleDb.OleDbCommand cmd = cnx.CreateCommand()) // Création de la commande à partir de la connexion
        {
            cmd.CommandType = System.Data.CommandType.Text;
            cmd.CommandText = "INSERT INTO CommandeF (Code,[Date]) VALUES (?code,?date)"; // Ta requête de base avec les paramètres ?code et ?date
            cmd.Parameters.Add("?code", System.Data.OleDb.OleDbType.VarChar).Value = CCode.Text; // On ajoute à la commande le paramètre ?code, de type VarChar avec comme valeur CCode.Text
            cmd.Parameters.Add("?date", System.Data.OleDb.OleDbType.Date).Value = dateTimePicker1.Value.Date; // On ajoute à la commande le paramètre ?date, de type Date avec comme valeur dateTimePicker1.Value.Date
     
            cnx.Open(); // Ouverture de la connexion
            cmd.ExecuteNonQuery(); // Exécution de la requête
        }
    }
    Tu remarqueras que c'est pratiquement ce que t'on fait popo et Pol63.
    C'est quand même plus lisible et compréhensible que ton code, non ?
    Tu dois retenir une chose concernant les paramètres avec OleDB et Access (à ce que j'en ai lu), c'est que le nom des paramètres est ignoré, donc il faut toujours que tes paramètres soit ajoutés dans l'ordre ou tu les attend dans la requête.

    Un dernier conseil, utilise à outrance la touche F1 dans VS, MSDN est pas trop mal fait et donne beaucoup d'exemples.

    Bonne continuation.

Discussions similaires

  1. [VB.net] Verifier le format d'une Date
    Par Seth77 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/11/2006, 13h21
  2. Encore un problème sur le format d'une date!
    Par bygui dans le forum Langage
    Réponses: 1
    Dernier message: 26/06/2006, 08h41
  3. commant changer le format d'une date?
    Par tribaleur dans le forum ASP
    Réponses: 5
    Dernier message: 02/06/2006, 07h55
  4. [C#] Serveur anglais : format d'une date
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 5
    Dernier message: 18/01/2006, 16h21
  5. Problème de select sur une date (DATETIME....)
    Par zeldoi5 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/05/2005, 11h19

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