Comparer des heures

Signaler
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bonjour a tous, voici mon problème :



Je souhaite comparer deux dates au format : YYYY-MM-JJ HH:MM:SS



Si la date actuelle est égale a la date saisie, afficher un message !!!



Pour récupérer la date du système, je fais :

private void Principal_Load(object sender, System.EventArgs e)

{

Principal formtest = new Principal();



Rectangle rec = new Rectangle();

rec = Screen.GetWorkingArea(rec);

int x = rec.Width;

int largeur = formtest.Size.Width;



timer1 = new Timer();

timer1.Enabled = true;

timer1.Interval = 1000;

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);





}



private void timer1_Tick(object sender, System.EventArgs e)

{

labHeure.Text = DateTime.Now.ToString("HH:mm:ss");

labDate.Text = DateTime.Now.ToString("dd-MM-yyyy");

}



J'espère avoir été assez clair. Merci et bon dimanche :)

24 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Salut,

Si j'ai bien suivi :
string dt1 = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss");
string dt2 = labDate.Text + labHeure.Text;
if ( dt2 == dt1 )
{
// affichage
}

PS : perso je remplacerais
labHeure.Text = DateTime.Now.ToString("HH:mm:ss");
labDate.Text = DateTime.Now.ToString("dd-MM-yyyy");
par
DateTime dt = DateTime.Now;
labHeure.Text = dt.ToString("HH:mm:ss");
labDate.Text = dt.ToString("dd-MM-yyyy");

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Salut, la structure DateTime supporte l'operateur d'egalité donc y'a pas plus simple pour comparer deux dates.. Et il est plus performant de comparer deux dates plutot que leurs representations sous forme de chaine de caracteres.. Et comme le dit Coq il est preferable d'eviter le double appel a DateTime.Now dans ton timer..
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Oui j'ai vu qu'il y avait la méthod Equal je crois mais je n'arrive pas
a l'utiliser. Pourrais tu me faire un ptit exemple stp !!!

Merci de votre aide
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
l'utilisation de l'opérateur == est suffisante
if (dt1 == dt2 ) (avec dt1 et dt2 deux instances de DateTime)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
A noter que les millisecondes seront elles aussi prisent en compte dans la comparaison.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Piep, et bien pourquoi tu n'arrives pas l'utiliser, c'est une methode comme une autre..

// L'operateur d'egalité

if ( dt1 == dt2 )
{
// Equal
}

// La methode membre

if ( dt1.Equals( dt2 ) )
{
// Equal
}

// La methode static

if ( DateTime.Equals( dt1, dt2 ) )
{
// Equal
}

// La methode compliquée

if ( dt1.Ticks == dt2.Ticks )
{
// Equal
}
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Pour comparer deux dates, il y a effectivement l'opérateur =, mais
celui-ci prend en compte, comme coq l'a dit, les millisecondes. Pour
comparer deux dates au niveau "jour", il faut faire date1.date ==
date2.date



Si après tu veux un niveau de comparaison à la minutes, je crois que tu
dois passer par (date1.date date2.date) && (date1.hour
date2.hour) && (date1.minute == date2.minute)



En résumé, une fois ton texte entré dans ta textBox (ou MaskedTextBox ?), tu fais :





if(System.Convert.ToDateTime(ChampTexteDate.Text).Date == System.DateTime.Now.Date){

Affichage();

}

est-ce que tu penses que ceci peut s'adapter à ton cas ?



^^
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

J'ai donc essayé comme ci, mais la fenetre ne se lance pas a l'heure indiquée :



private void Principal_Load(object sender, System.EventArgs e)

{

Principal formtest = new Principal();



Rectangle rec = new Rectangle();

rec = Screen.GetWorkingArea(rec);

int x = rec.Width;

int largeur = formtest.Size.Width;



timer1 = new Timer();

timer1.Enabled = true;

timer1.Interval = 1000;

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

string dt1 = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss");

string dt2 = "06-06-2005 17:26:00";



if ( dt2 == dt1 )

{


vbMaf.Windows.Forms.DesktopAlert da = new
vbMaf.Windows.Forms.DesktopAlert();

da.Show();

}



}



private void timer1_Tick(object sender, System.EventArgs e)

{

DateTime dt = DateTime.Now;

labHeure.Text = dt.ToString("HH:mm:ss");

labDate.Text = dt.ToString("dd-MM-yyyy");

}



Merci
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Ben je pense que c'est normal. Ton timer est pas fait pour lancer ta fenêtre ?



Ce qui se passe ici, c'est que tu regardes une seule fois si c'est
l'heure de lancer ton appli... Si tu lances ton prog principal à 17:20,
il fait une vérification à 17:20, et puis basta, il revérifie plus
après... je pense que ce que tu as voulu mettre, c'est plutot ça :



private void Principal_Load(object sender, System.EventArgs e)

{

Principal formtest = new Principal();



timer1 = new Timer();

timer1.Enabled = true;

timer1.Interval = 1000;

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);



}



private void timer1_Tick(object sender, System.EventArgs e)

{

DateTime dt = DateTime.Now;

labHeure.Text = dt.ToString("HH:mm:ss");

labDate.Text = dt.ToString("dd-MM-yyyy");



string dt1 = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss");


string dt2 = "06-06-2005 17:26:00";





if ( dt2 == dt1 )


{


vbMaf.Windows.Forms.DesktopAlert da = new
vbMaf.Windows.Forms.DesktopAlert();


da.Show();


}

}

D'autre part, je ne pense pas que ce code soit totallement stable... je
m'explique. Si ton PC rame un bon coup, mettons entre 17:26:59 et
17:26:01, alors ton timer va être ralenti et il va sauter la bonne
seconde... Donc ton a.Show(); ne sera pas effectué... Je pense donc que
faire une comparaison jusqu'à la seconde dans le cas présent n'est pas
une bonne idée...



Enfin attends quelques minutes, je vais faire un petit truc pour toi...
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Depuis que j'ai fais la méthode que tu indiques précédemment, je ne peux plus quitter ma fenetre qui s'est lancé

Etrange tout ca !!! ;)
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Tu peux plus quitter ou elle se relance directement après que tu l'aies fermée ?



Autre truc : tu utilises quoi comme version du FrameWork ?
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Nan, je ne peux plus quitter la fenêtre. Normalement, elle se ferme
toute seule après X secondes ou par un bouton et la ni l'une ni l'autre
des facons ne fonctionne.



Version : Microsoft .NET Framework SDK v1.1



Merci cher ami
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Je crois que j'ai une piste... En fait, ta fenetre, essaye de l'ouvrir avec ShowDialog plutot que Show()... juste pour voir...
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

nan, c'est pareil, l'application plante meme j'ai l'impression !!! As tu eut mon message pv ?
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Sinon, je viens de faire un composant, mais je doute que tu puisses
l'utiliser, c'est un truc fait à l'arrache avec le framework 2.0 beta
2. Il permet de lancer un tâche à une heure précise.





Le concept est simple, plutot que de toujours regarder l'heure avec un
timer, je fais un thread, et je lui dit de "s'endormir" quelques
secondes, le temps d'arriver à la bonne heure. En gros, je créé un
objet TimeSpan que j'initialise avec un l'heure ou je dois lancer le
truc - l'heure actuelle. Je après le thread, je fais un sleep d'un
durée équivalente à mon time span. et juste après le sleep, je lance un
évènement qui peut être récupéré, et qui est lancé pile poil à l'heure
souhaitée...








Je peux te passer le code si tu veux.
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Je viens de répondre à ton message pv ^^...
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Je crois que j'ai ta solution... C'est plus simple que précédement, et
ca permet de ne pas sortir la massue pour écraser la fourmi ^^





private void Form1_Load(object sender, EventArgs e) {

// On va dire que l'on lance le truc 2 minutes après son lancement...

DateTime DateLancement = DateTime.Now.AddMinutes(2);

// On calcule la durée qui nous sépare de maintenant à DateLancement...

TimeSpan span
= new TimeSpan(DateLancement.Subtract(DateTime.Now).Ticks);

// On dit au
timer de réagir dans n millisecondes, ce qui correspond au temps entre

// maintenant et dans 2 minutes...

this.timer1.Interval = (int) span.TotalMilliseconds;

// On active le timer...

this.timer1.Enabled = true;

}



private void timer1_Tick(object sender, EventArgs e) {

// On
désactive le timer (sinon ce truc va se lancer toutes les 2 minutes)...

timer1.Enabled = false;

// C'est ici que tu fais ton Show();

MessageBox.Show("test");

}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Piep, peut etre que ce code correspond à ce que tu veux faire:

protected override void OnLoad( EventArgs args )
{
base.OnLoad( args );

alert = new DateTime( 2005, 6, 7, 8, 30, 0 );
activate = true;

timer = new Timer( );
timer.Interval = 1000;
timer.Tick += new EventHandler( Timer_Tick );
timer.Start( );
}

private void Timer_Tick( object sd, EventArgs args )
{
DateTime now = DateTime.Now;

if ( activate && now >= alert )
{
activate = false;
MessageBox.Show( this, now.ToString( ), "Alerte", MessageBoxButtons.OK, MessageBoxIcon.Warning );
}

labDate.Text = now.ToShortDateString( );
labTime.Text = now.ToLongTimeString( );
}
Messages postés
305
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 août 2011
5
Pas la peine d'aider Piep,



J'ai essayé de l'aider hier soir par MSN pendant 1h et demi, et le
gars, une fois qu'il a eu son info, il a même pas eu la descence de
dire ni merci ni merde, il s'est tout bonnement déconnecté (ou il m'a
bloqué). Comme on dit, fait du bien à Martin, il te chie dans la main !
Ca sert à rien d'aider des gens comme ca...
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Pas cool !