none
erreur "string not recognized as a valid date"

    Question

  • Bonjour,

    je travaille sous VS2010 avec SQLServer.

    j obtiens l erreur suivante: "String not recognized as a valid date" lorsque je fais l insertion de donnee de type date dont les jours sont superieur a 12.

    en effet mon champ de saisie de type date est de la forme jj/mm/aaaa.

    je me dis que ce souci proviens forcement de mon sql ou le champ date est de type datetime.

    comment convertir ma valeur date afin de plus avoir cette erreur?

    cordialement


    Marcelle NGOUNOU

    Thursday, May 10, 2012 6:37 AM

Answers

  • Bonjour,

    Dans ce cas utilisez la méthode DateTime.Parse() comme ceci au lieu de faire des concaténation de chaînes :

    new SqlParameter ("@DOS_DDN",DateTime.ParseExact( M_Dnaiss.Text, "dd/MM/yyyy", CultureInfo.CurrentCulture))
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marked as answer by marclas Thursday, May 10, 2012 4:50 PM
    Thursday, May 10, 2012 3:44 PM
  • effectivement

    mais je corrige un peu

    M_Dnaiss.Text.ToString().Substring (3,2))

    et la c OK

    merci


    Marcelle NGOUNOU

    • Marked as answer by marclas Thursday, May 10, 2012 4:49 PM
    Thursday, May 10, 2012 4:37 PM

All replies

  • Bonjour,

    Ce problème vient du fait qu'il y a une mauvaise interprétation des dates entre le client et le serveur SQL Server (le plus souvent si le client et le serveur sont installés dans une langue différente). Pour pallier à ce problème, il faut utiliser les requêtes paramétrés.
    Pouvez-vous nous montrer le code de la requête exécutée ? Nous vous indiquerons la bonné méthode à appliquer.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    Thursday, May 10, 2012 7:13 AM
  • bonjour

    voila mon code pour la requete

    ALTER PROCEDURE [dbo].[MAJStatutDossier]
    	@StaId int,
    	@DosID uniqueidentifier,
    	@staBL nvarchar (50)= null,
    	@staCRprod nvarchar (50)=null
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for procedure here
    	IF NOT EXISTS (SELECT dbo.CSR_STATUT.DOS_ID  FROM CSR_STATUT  
    			   WHERE DOS_ID  = @DosID 	 )
    	BEGIN
    		INSERT INTO CSR_STATUT 
    		VALUES (@StaId,CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS FLOAT)) AS DATETIME),@staBL,@staCRprod,@DosID )
    	END
    	ELSE
    	BEGIN
    		UPDATE CSR_STATUT 
    		SET STA_ID = @StaId , STA_DATE = CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS FLOAT)) AS DATETIME),
    			STA_BL =@staBL ,STA_CRPROD =@staCRprod 
    		WHERE DOS_ID = @DosID 
    	END

    merci


    Marcelle NGOUNOU

    Thursday, May 10, 2012 7:54 AM
  • Bonjour,

    Votre problème ne semble pas venir de la procédure stockée mais plustôt d'une requête que vous faites en C#. Pouvez-vous nous montrer le bon code qui poserai problème ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    Thursday, May 10, 2012 9:55 AM
  • bonjour

    le code de ma procedure

    USE [RECLACSR-DB]
    GO
    /****** Object:  StoredProcedure [dbo].[CreerDossier]    Script Date: 05/10/2012 11:05:23 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE  [dbo].[CreerDossier] 
    (
    	@DOS_ID uniqueidentifier = '00000000-0000-0000-0000-000000000000' OUTPUT,
    	@PID_CODE nchar(4) ,
    	@TIT_CODE nchar(3) ,
    	@NAT_CODE char(4) ,
    	@DOS_NOBR nvarchar(50),
    	@DOS_NODE nchar(10) ,
    	@DOS_VERSEMENT money ,
    	@DOS_TYDE char(2) ,
    	@DOS_NOPREC nchar(10) ,
    	@DOS_NOM nvarchar(100), 
    	@DOS_PRENOM nvarchar(100) ,
    	@DOS_DDN datetime ,
    	@DOS_SEX char(1) ,
    	@DOS_LNAIS nvarchar(50),
    	@DOS_CONTACT nvarchar(50) ,
    	@DOS_NPERE nvarchar(50) ,
    	@DOS_NMERE nvarchar(50) ,
    	@DOS_PROF nvarchar(50) ,
    	@DOS_TAILLE int ,
    	@DOS_LRED nvarchar(50) ,
    	@CAT_CODE char(1) ,	
    	@CMP_ID uniqueidentifier = '00000000-0000-0000-0000-000000000000' OUTPUT,
    	@CMP_DESC nvarchar (50)
    )
    AS
    	SET NOCOUNT ON;
    	
        IF @DOS_ID IS NULL OR @DOS_ID = '00000000-0000-0000-0000-000000000000' 
        BEGIN
          SET @DOS_ID = NEWID()
          set @CMP_ID = NEWID ()
        END
        ------verifier que le BR ne compte pas deja 30 dossier
        DECLARE @STATUTDOSSIER INT
        SET  @STATUTDOSSIER = 6
        
         DECLARE   @NBREDOSSIER INT;  
         SET @NBREDOSSIER  = (SELECT COUNT (*) FROM dbo.CSR_DOSSIER WHERE DOS_NOBR =@DOS_NOBR AND PID_CODE =@PID_CODE )
         
    	IF @NBREDOSSIER =30
    	BEGIN
    			UPDATE dbo.CSR_DOSSIER SET PID_CODE= @PID_CODE , TIT_CODE=@TIT_CODE ,NAT_CODE = @NAT_CODE ,DOS_NOBR= @DOS_NOBR 
    				  ,DOS_NODE = @DOS_NODE ,DOS_VERSEMENT= @DOS_VERSEMENT  ,DOS_TYDE= @DOS_TYDE,DOS_NOPREC=@DOS_NOPREC
    			   ,DOS_NOM=@DOS_NOM , DOS_PRENOM=@DOS_PRENOM  ,DOS_DDN=@DOS_DDN  ,DOS_SEX=@DOS_SEX  ,DOS_LNAIS=@DOS_LNAIS 
    			   ,DOS_CONTACT=@DOS_CONTACT ,DOS_NPERE=@DOS_NPERE,DOS_NMERE=@DOS_NMERE  ,DOS_PROF=@DOS_PROF 
    			   ,DOS_TAILLE=@DOS_TAILLE  ,DOS_LRED=@DOS_LRED  ,DOS_DTEN=CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS FLOAT)) AS DATETIME),CAT_CODE=@CAT_CODE
    			WHERE DOS_NODE = @DOS_NODE
    	END 
    	ELSE 
    	BEGIN
    			IF @NBREDOSSIER <30
    			BEGIN
    		    
    				UPDATE dbo.CSR_DOSSIER SET PID_CODE= @PID_CODE , TIT_CODE=@TIT_CODE ,NAT_CODE = @NAT_CODE ,DOS_NOBR= @DOS_NOBR 
    						  ,DOS_NODE = @DOS_NODE ,DOS_VERSEMENT= @DOS_VERSEMENT  ,DOS_TYDE= @DOS_TYDE,DOS_NOPREC=@DOS_NOPREC
    					   ,DOS_NOM=@DOS_NOM , DOS_PRENOM=@DOS_PRENOM  ,DOS_DDN=@DOS_DDN  ,DOS_SEX=@DOS_SEX  ,DOS_LNAIS=@DOS_LNAIS 
    					   ,DOS_CONTACT=@DOS_CONTACT ,DOS_NPERE=@DOS_NPERE,DOS_NMERE=@DOS_NMERE  ,DOS_PROF=@DOS_PROF 
    					   ,DOS_TAILLE=@DOS_TAILLE  ,DOS_LRED=@DOS_LRED  ,DOS_DTEN=CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS FLOAT)) AS DATETIME)   ,CAT_CODE=@CAT_CODE
    				WHERE DOS_NODE = @DOS_NODE
    				IF @@ROWCOUNT =0
    				BEGIN
    					-- Inserer une ligne du dossier crée dans la table dossier
    					INSERT INTO [RECLACSR-DB].[dbo].[CSR_DOSSIER]
    					(
    						[DOS_ID]
    					   ,[PID_CODE]
    					   ,[TIT_CODE]
    					   ,[NAT_CODE]
    					   ,[DOS_NOBR]
    					   ,[DOS_NODE]
    					   ,[DOS_VERSEMENT]
    					   ,[DOS_TYDE]
    					   ,[DOS_NOPREC]
    					   ,[DOS_NOM]
    					   ,[DOS_PRENOM]
    					   ,[DOS_DDN]
    					   ,[DOS_SEX]
    					   ,[DOS_LNAIS]
    					   ,[DOS_CONTACT]
    					   ,[DOS_NPERE]
    					   ,[DOS_NMERE]
    					   ,[DOS_PROF]
    					   ,[DOS_TAILLE]
    					   ,[DOS_LRED]
    					   ,[DOS_DTEN]
    					   ,[CAT_CODE]
    					 )
    					 VALUES
    						   (
    								@DOS_ID ,
    								@PID_CODE  ,
    								@TIT_CODE ,
    								@NAT_CODE ,
    								@DOS_NOBR ,
    								@DOS_NODE ,
    								@DOS_VERSEMENT  ,
    								@DOS_TYDE  ,
    								@DOS_NOPREC  ,
    								@DOS_NOM , 
    								@DOS_PRENOM  ,
    								@DOS_DDN  ,
    								@DOS_SEX  ,
    								@DOS_LNAIS ,
    								@DOS_CONTACT  ,
    								@DOS_NPERE  ,
    								@DOS_NMERE  ,
    								@DOS_PROF ,
    								@DOS_TAILLE  ,
    								@DOS_LRED  ,
    								CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS FLOAT)) AS DATETIME)  ,
    								@CAT_CODE  
    							);
    					-----insertion dans la table statut
    					INSERT INTO dbo.CSR_STATUT (STA_ID,STA_DATE ,DOS_ID ) VALUES (@STATUTDOSSIER ,CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS FLOAT)) AS DATETIME)   ,@DOS_ID);
    					------insertion du complement
    					---2: cptons le nbre d'enregistrement pour ce dos
    					DECLARE @NbreEnregistrement int
    					set @NbreEnregistrement =(	SELECT COUNT (DOS_ID) FROM CSR_COMPLEMENT 
    												WHERE CSR_COMPLEMENT.DOS_ID =  (SELECT dbo.CSR_DOSSIER.DOS_ID 
    																				FROM dbo.CSR_DOSSIER WHERE DOS_NODE =@DOS_NODE ))
    					IF @NbreEnregistrement=0
    					BEGIN
    						 Set @Cmp_Desc ='VERSEMENT INITIAL'
    					END 
    					ELSE
    					BEGIN
    						set @Cmp_Desc ='COMPLEMENT' + CONVERT(nvarchar, @NbreEnregistrement)
    					END
    					 				
    					INSERT INTO CSR_COMPLEMENT 
    					VALUES(@CMP_ID ,@DOS_ID,@DOS_NOBR ,@Cmp_Desc ,	@DOS_VERSEMENT ,CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS FLOAT)) AS DATETIME)  )
    ;
    				IF @@ERROR > 0 ROLLBACK
    				END 
    			END
    			 
    	END
    	
    	
    	

    l a ppel de la procedure

           private void cmd_Enregistrer_Click(object sender, EventArgs e)
             {
                 
                 if (Affectations() )
                 {
                     try
                     {
                         // recupere la valeur de l ID dossier
                         var idParam = new SqlParameter
                         {
                             ParameterName = "@DOS_ID",
                             SqlDbType = SqlDbType.UniqueIdentifier,
                             Direction = ParameterDirection.Output
                         };
                         // recupere la valeur de l ID complement
                         var idCpt = new SqlParameter
                         {
                             ParameterName = "@CMP_ID",
                             SqlDbType = SqlDbType.UniqueIdentifier,
                             Direction = ParameterDirection.Output
                         };
                         Boolean SUCCES =  ExecuteRequete.ExecuteStoredProcedure("CreerDossier",idParam ,idCpt, new SqlParameter ("@PID_CODE",cbPI.Text),new SqlParameter ("@TIT_CODE",cbTITRE.Text),
    					        new SqlParameter ("@NAT_CODE" ,cbNat.SelectedValue.ToString ()),new SqlParameter ("@DOS_NOBR", txtBR.Text),new SqlParameter ("@DOS_NODE",txtNode.Text),
                                new SqlParameter ("@DOS_VERSEMENT",Decimal.Parse(txtMTverse.Text)),new SqlParameter ("@DOS_TYDE",cbTypDde.SelectedValue.ToString().ToUpper ()),new SqlParameter ("@DOS_NOPREC",txtTitrePrec.Text),
    					        new SqlParameter ("@DOS_NOM",txtNom.Text),new SqlParameter ("@DOS_PRENOM ",txtPrenom.Text),new SqlParameter ("@DOS_DDN",DateTime.Parse(M_Dnaiss.Text)),
                                new SqlParameter ("@DOS_SEX",cbsexe.Text),new SqlParameter ("@DOS_LNAIS",txtLNaiss.Text),new SqlParameter ("@DOS_CONTACT ",txtContact.Text),
                                new SqlParameter ("@DOS_NPERE",txtPere.Text),new SqlParameter ("@DOS_NMERE ",txtMere.Text),new SqlParameter ("@DOS_PROF",txtProf.Text  ),
                                new SqlParameter ("@DOS_TAILLE",int.Parse(txtTaille.Text)),new SqlParameter ("@DOS_LRED",txtLres.Text),
                                new SqlParameter ("@CAT_CODE ",cbCat.Text), new SqlParameter ("@CMP_DESC", "Premier Versement"));
                         if (SUCCES)
                         {
    
                             SystemSounds.Beep.Play (); 
                             //MessageBox.Show("OK");
                             // effacer
                             Effacer();
                         }
                         else
                         {
                              MessageBox.Show("Dossier non enregistrer","SAD-CSR",MessageBoxButtons.OK ,MessageBoxIcon.Warning  );
                             // effacer
                             //insricre ds le fichier log
                         }
                     }
                     catch (Exception monEx)
                     {
                         MessageBox.Show(monEx.Message );
                     }
                 }
                 else
                 {
                     MessageBox.Show("Veuillez renseigner/corriger les champs en rouge ", "SAD-CSR", MessageBoxButtons.OK,
                                     MessageBoxIcon.Information);
                 }
             }

    merci


    Marcelle NGOUNOU

    Thursday, May 10, 2012 10:06 AM
  • Bonjour,

    Quel est langue de votre Windows ?

    Dans le code suivant :

    DateTime.Parse(M_Dnaiss.Text)

    Qu'elle est la valeur saisie de l'utilisateur qui pose problème dans "M_Dnaiss.Text".

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    Thursday, May 10, 2012 12:20 PM
  • Le problème est pris à l'envers je pense. J'ai déjà eu le même souci.

    D'après ce que je comprends la date est bien en format France : jj/mm/aaaa.
    Seulement SQL Server attends une date format Anglophone : mm/jj/aaaa.

    Donc c'est SQL Server qui comprends mal, ou plutôt l'utilisateur je dirais (le compte de connexion à la base).

    Cette configuration se fait au niveau des propriétés de ce compte utilisateur. Il est possible de définir la langue par défaut par "French". Je suppose qu'actuellement il se trouve en "English".

    Attention, définir la langue du SQL Server lors de son installation en "French" n'affecte en rien cette particularité. Il faut faire attention à cette variable à chaque ajout d'un utilisateur dans une base.

    EDIT : Si tu n'as pas la possibilité de modifier la langue du compte utilisateur, là par contre c'est plus délicat. Peut être que ceci pourra aider...
    http://networking.ringofsaturn.com/SQL/howtoformatdatetime.php


    Thursday, May 10, 2012 2:23 PM
  • Bonjour,

    Dans le code C# à cause du formatage je ne vois pas comment est passé le paramètre DOS_DDN. Il faut le passer sous forme de date et non pas sous forme de texte. Dans ce cas, la conversion sous une forme indépendante du pays sera faite automatiquement côté client et on n'aura donc jamais de souci (quel que soit le réglage sur serveur). Donc concrètement on devrait avoir qq chose comme DateTime.Parse(txtDate.Text) et non pas txtDate.Text tout seul pour passer le paramètre.

    Je soupçonne que ce paramètre est actuellement passée sous forme de texte, donc le texte est transmis tel quel et au final ne peut pas être converti sur le serveur en une date valide compte tenu du paramétrage actuel de la connexion en cours.

    La règle générale est que les paramètres transmis vers un serveur SQL devraient toujours être transmis dans leur type natif (date, integer, string, decimal etc.. selon le cas) et non pas toujours sous forme de texte (je vois d'ailleurs que c'est bien le cas pour le versement qui utilise bien Decimal.Parse, à priori cela a du être oublié pour une date).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".



    Thursday, May 10, 2012 2:46 PM
  • bonjour,

    la date est bien parse coe le montre

    new SqlParameter ("@DOS_DDN",DateTime.Parse(M_Dnaiss.Text)),

    g c plu koi faire


    Marcelle NGOUNOU

    Thursday, May 10, 2012 2:57 PM
  • Bonjour,

    remplacez

    new SqlParameter ("@DOS_DDN",DateTime.Parse(M_Dnaiss.Text))
    par
    new SqlParameter ("@DOS_DDN",new DateTime(Convert.ToInt32(M_Dnaiss.Text.SubString(6,4)),Convert.ToInt32(M_Dnaiss.Text.SubString(3,2)), Convert.ToInt32(M_Dnaiss.Text.SubString(0,2))))


    Regards, Nico

    Thursday, May 10, 2012 3:01 PM
  • bonjour,

    je commence a avoir des souci lorsque j ai des valeur au dela de 12 par exemple 12/05/2012

    merci


    Marcelle NGOUNOU

    Thursday, May 10, 2012 3:01 PM
  • bonjour,

    c est effectivement le souci

    mais STP peux tu m expliquer comment changer la langue?


    Marcelle NGOUNOU

    Thursday, May 10, 2012 3:07 PM
  • Bonjour,

    remplacez

    new SqlParameter ("@DOS_DDN",DateTime.Parse(M_Dnaiss.Text))
    par
    new SqlParameter ("@DOS_DDN",new DateTime(Convert.ToInt32(M_Dnaiss.Text.SubString(6,4)),Convert.ToInt32(M_Dnaiss.Text.SubString(3,2)), Convert.ToInt32(M_Dnaiss.Text.SubString(0,2))))


    Regards, Nico

    le comportement de datetime.parse depends du currentculture; avec substring, ca marchera toujours tant que le format soit jj/mm/aaaa

    Regards, Nico

    Thursday, May 10, 2012 3:17 PM
  • Bonjour,

    Dans ce cas utilisez la méthode DateTime.Parse() comme ceci au lieu de faire des concaténation de chaînes :

    new SqlParameter ("@DOS_DDN",DateTime.ParseExact( M_Dnaiss.Text, "dd/MM/yyyy", CultureInfo.CurrentCulture))
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marked as answer by marclas Thursday, May 10, 2012 4:50 PM
    Thursday, May 10, 2012 3:44 PM
  • bonjour,

    oups

    mon m_dnaiss est un maskedittextbox

    pas de fonction substring disponible ...

    ??????


    Marcelle NGOUNOU

    Thursday, May 10, 2012 3:49 PM
  • bonjour,

    oups

    mon m_dnaiss est un maskedittextbox

    pas de fonction substring disponible ...

    ??????


    Marcelle NGOUNOU

    ???? marcelle, substring est un méthode de String, et 'm_dnaiss.Text' est un string, alors... 

    M_Dnaiss.Text.SubString(6,4))

    devrait etre juste, non?

    En tout cas, la solution de Gilles est peut-etre plus élégant, pourtant je mettrais 

    CultureInfo.InvariantCulture

    au lieu de 

    CultureInfo.CurrentCulture


    Regards, Nico

    Thursday, May 10, 2012 4:27 PM
  • effectivement

    mais je corrige un peu

    M_Dnaiss.Text.ToString().Substring (3,2))

    et la c OK

    merci


    Marcelle NGOUNOU

    • Marked as answer by marclas Thursday, May 10, 2012 4:49 PM
    Thursday, May 10, 2012 4:37 PM
  • Que donne MessageBox.Show(System.Threading.Thread.CurrentThread.CurrentCulture.Name) ?

    On dirait que le PC est configuré en anglais us alors que les dates sont saisies en français. Avec ce principe je crains que l'on ait des problèmes par exemple avec les valeurs décimales. Le code pourra aussi fonctionner potentiellement quel que soit la culture alors qu'avec l'approche actuel, cela ne fonctionnera pas sur un PC anglais us (même si c'est peu probable autant prendre de bonnes habitudes)...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    Thursday, May 10, 2012 5:07 PM
  • effctivement,

    le pc est configure en anglais US


    Marcelle NGOUNOU

    Thursday, May 10, 2012 5:32 PM
  • Donc le comportement est normal. Pour les conversions de date ou numérique vers texte et inversement, .NET Framework utilise la culture en cours donc il est normal que DateTime.Parse ne fonctionne pas avec le texte 20/05/2012 qui n'est pas une date valide selon le standard en-us. Je pense que vous aurez le même genre de problème, par exemple 1,234 vaut 1234 en en-us (la virgule est le séparateur de milliers et non pas le point décimal) avec la méthode actuelle (et également dans le sens contraire lorsque vous afficher une date ou un nombre sous forme de texte) donc cela sera très difficile à gérer.

    Donc je dirais qu'il est préférable :
    - si l'application doit pouvoir fonctionner indépendamment du réglage du poste forcer la culture en français (cf http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture.aspx ) au démarrage de l'appli et donc toutes les fonctions de .NET se baseront bien sur le français et 20/05/2012 sera donc à nouveau une date valide qui sera bien le 20 mai.
    - soit accepter que l'application se conforme à ce que l'utilisateur a voulu et donc 20/05/2012 est effectivement une date invalide, l'utilisateur devant entrer les dates au format dd/MM/yyyy avec un réglage en-us.

    Ou éventuellement faire les deux (avoir un réglage interne à l'appli permettant par exemple d'avoir un mode "Auto" qui va prendre ce qui est dans le panneau de config ou de forcer explicitement une langue comme le français si on mets "fr-fr" plutôt que auto).

    Pour illustration voir par exemple ce qu'affiche le code suivant :

      static void Main(string[] args)
            {
                string[] Langues={"en-us","fr-fr"};
                string[] Tests={"01/02/2012","16/02/2012"};
                foreach(var langue in Langues)
                {
                    System.Threading.Thread.CurrentThread.CurrentCulture=new System.Globalization.CultureInfo(langue);
                    Console.WriteLine(langue);
                    foreach(var test in Tests)
                    {
                        DateTime d;
                        Console.Write(test+":");
                        if(DateTime.TryParse(test,out d))
                        {
                            Console.WriteLine(String.Format("valide, jour {0}, mois {1}",d.Day,d.Month));
                        }
                        else
                        {
                            Console.WriteLine("invalide");
                        }
                    }
                }
                Console.ReadLine();
            }

    Qui va donc afficher :

    en-us
    01/02/2012:valide, jour 2, mois 1
    16/02/2012:invalide
    fr-fr
    01/02/2012:valide, jour 1, mois 2
    16/02/2012:valide, jour 16, mois 2


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    Friday, May 11, 2012 11:34 AM