Toon posts:

[C#] tussen 2 uren in.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil een melding generen als het huidige uur tussen 2 voorgedefinieerde uren ligt.
Bijvoorbeeld tussen 10:00 en 11:00 of tussen 23:00 en 4:00

Ik heb diverse dingen geprobeerd, maar krijg het niet generiek genoeg om het in alle gevallen voor elkaar te krijgen.

Het volgende heb ik geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("nl-NL");
        DateTime Current = DateTime.Now;
        DateTime MinBound = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 0, 0, DateTimeKind.Local);
        DateTime MaxBound = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 7, 0, 0, DateTimeKind.Local);
        
        if (Current.Hour == 23)
        {
            Current = Current.AddHours(1);
        }
        if ((MinBound.Hour >= Current.Hour) && (Current.Hour <= MaxBound.Hour))
        {
            Label1.Text += "<br> lig te slapen";
        }


Daarnaast heb ik ook de timespan geprobeerd i.p.v. DateTime en daarbij loop ik tegen dezelfde problemen aan.

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Err, gewoon:

DateTime lower = bla
DateTime higher = bla2

if(lower < now && higher > now)
{
TADAAA!
}

.Net kent operator overloading dus je kunt gewoon datetimes met mekaar vergelijken.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Mawlana
  • Registratie: Juli 2002
  • Laatst online: 01:58
C#:
1
2
3
4
if(Current >= MinBound && Current <= MaxBound)
{
    Label1.Text += "<br> lig te slapen";
}


Of denk ik nu te simpel?

Acties:
  • 0 Henk 'm!

Verwijderd

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(MinBound < MaxBound)
{
    if(Current >= MinBound && Current <= MaxBound)
    {
        Label1.Text += "<br> lig te slapen";
    }
}
else
{
    if(Current >= MinBound || Current <= MaxBound)
    {
        Label1.Text += "<br> lig te slapen";
    }
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hydra schreef op vrijdag 28 november 2008 @ 13:53:
Err, gewoon:

DateTime lower = bla
DateTime higher = bla2

if(lower < now && higher > now)
{
TADAAA!
}

.Net kent operator overloading dus je kunt gewoon datetimes met mekaar vergelijken.
Zo'n constructie heb ik ook geprobeerd, maar ik wil het dag onafhankelijk hebben.
In jou voorbeeld gaat het mijn inziens fout:
DateTime lower = 28-11-2008 23:00
DateTime higher = 28-11-2008 4:00
Hierdoor zal hij niet in de if komen.

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik zou het als volgt doen:
C#:
1
2
3
4
5
6
7
TimeSpan window = MaxBound.Substract(MinBound); 
TimeSpan offset = MaxBound.Substract(Current);

if (offset <= window)
 //valt in time window
else
 //valt er buiten


De code bepaald of het verschil met Current minder of gelijk is dan het verschil met de minimale datum. Deze code werkt dus ook over meerdere dagen.

Overigens neem ik aan dat MaxBound day + 1 moet zijn omdat je anders nooit er tussen min en max kunt zitten omdat MaxBound (7 uur 's ochtends) eerder valt dan MinBound (11 uur 's avonds, maar op dezelfde dag)

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • yade
  • Registratie: Mei 2002
  • Laatst online: 16-07 13:47
Verwijderd schreef op vrijdag 28 november 2008 @ 14:03:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(MinBound < MaxBound)
{
    if(Current >= MinBound && Current <= MaxBound)
    {
        Label1.Text += "<br> lig te slapen";
    }
}
else
{
    if(Current >= MinBound || Current <= MaxBound)
    {
        Label1.Text += "<br> lig te slapen";
    }
}
Dit is niet mooi hè? ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 28 november 2008 @ 14:03:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(MinBound < MaxBound)
{
    if(Current >= MinBound && Current <= MaxBound)
    {
        Label1.Text += "<br> lig te slapen";
    }
}
else
{
    if(Current >= MinBound || Current <= MaxBound)
    {
        Label1.Text += "<br> lig te slapen";
    }
}
Ik denk met een aanvulling van .Hour het moet gaan lukken maar mooi is het niet...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (MinBound.Hour < MaxBound.Hour)
        {
            if (Current.Hour >= MinBound.Hour && Current.Hour <= MaxBound.Hour)
            {
                Label1.Text += "<br> lig te slapen";
            }
        }
        else
        {
            if (Current.Hour >= MinBound.Hour || Current.Hour <= MaxBound.Hour)
            {
                Label1.Text += "<br> lig te slapen";
            }
        }

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Niemand_Anders schreef op vrijdag 28 november 2008 @ 14:14:
Ik zou het als volgt doen:
C#:
1
2
3
4
5
6
7
TimeSpan window = MaxBound.Substract(MinBound); 
TimeSpan offset = MaxBound.Substract(Current);

if (offset <= window)
 //valt in time window
else
 //valt er buiten


De code bepaald of het verschil met Current minder of gelijk is dan het verschil met de minimale datum. Deze code werkt dus ook over meerdere dagen.

Overigens neem ik aan dat MaxBound day + 1 moet zijn omdat je anders nooit er tussen min en max kunt zitten omdat MaxBound (7 uur 's ochtends) eerder valt dan MinBound (11 uur 's avonds, maar op dezelfde dag)
In dit geval zou je MaxBound +1 doen, maar als je de tijd nu wilt wijzigen naar minbound = 10:00 en maxbound = 15:00 dan werkt het weer niet goed

Acties:
  • 0 Henk 'm!

Verwijderd

C#:
1
2
3
4
5
if((MinBound < MaxBound && Current >= MinBound && Current <= MaxBound) ||
((MinBound > MaxBound) && (Current >= MinBound || Current <= MaxBound))
    {
        Label1.Text += "<br> lig te slapen";
    }


Zo beter? Ik vind de condities dan niet zo erg leesbaar.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nope, niet de meest mooie oplossing, maar het is wel de enige die tot nu toe werkt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
En met onderstaande vang ik natuurlijk af dat ik die dag iets langer op bed lig ;)
code:
1
2
3
 if (Current.DayOfWeek == DayOfWeek.Saturday)
{
}

Acties:
  • 0 Henk 'm!

  • Rainmaker1987
  • Registratie: Juni 2005
  • Laatst online: 08-12-2024
Mij lijkt de volgende code behoorlijk generiek:

C#:
1
2
3
4
5
6
7
DateTime Current = DateTime.Now;
DateTime MinBound = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 20, 0, 0, DateTimeKind.Local);
DateTime MaxBound = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 7, 0, 0, DateTimeKind.Local);
if (MinBound.Hour > MaxBound.Hour)
     MaxBound = MaxBound.AddDays(1);
if ((MinBound <= Current) && (Current <= MaxBound))
     Console.WriteLine("Lekker slapen");


Het checkt eerst even of MinBound en MaxBound op dezelfde dag liggen (dat is immers zo wanneer MaxBound.hour > MinBound.hour wanneer je er vanuit gaat dat de totale periode nooit meer dan 24 uur mag zijn) Als dit niet zo is gewoon MaxBound een extra dagje geven en de vergelijk daarna is vrij eenvoudig
Pagina: 1