Toon posts:

[c#] Berekenen datum mbv week en jaar

Pagina: 1
Acties:
  • 321 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Zoals de titel zegt, bekend is het weeknummer en het jaar. Op onderstaande manier wordt de juiste datum berekend van de eerste dag van de week (bij mij maandag) maar dan van het jaar 2003. Ik heb echter even geen id hoe ik het jaar hierin verwerkt krijg.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string week = ds_periode.Tables[0].Rows[indexnummer][1].ToString();
string jaar = ds_periode.Tables[0].Rows[indexnummer][2].ToString();

//plaatsen weeknummer
l_weeknummer.Text = week;

//plaatsen datum van maandag 
GregorianCalendar c = new GregorianCalendar();
int a = c.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay,System.DayOfWeek.Sunday);
            
int b = Int32.Parse(week);
int w = ((b-a)*7);
DateTime monday = DateTime.Now.AddDays(0 - (BepaalDag.FirstDayOfWeek()-w));

string firstdayofweek = monday.ToString("d");
l_datum.Text = "(vanaf "+firstdayofweek+")";

    


De bedoeling is dus met behulp van de systeemtijd de datum van maandag uit te reken van de ingegeven week plus jaar.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14-12 19:10
Wat heb je nu precies nodig? Enkel het jaar van de huidige (systeem)datum?

https://fgheysels.github.io/


  • Nazgul
  • Registratie: Februari 2000
  • Laatst online: 11-10-2022

Nazgul

Digital Pizza Crew

Je kunt er van uit gaan dat 01-01-xxxx altijd in week 1 van een jaar valt. Als je daar de gezochte week - 1 bij optelt kom je in de gewenste week.
Als je dan bepaald welke dag van de week dat is en dat getal -1 van die datum aftrekt kom je uit op de eerste dag van die week.
Het is dan afhankelijk van je Culture welke dag dat is (zondag of maandag).

Je krijgt dan zoiets:
C#:
1
2
3
4
5
6
7
int year=2003;
int week=32;

DateTime temp;
GregorianCalendar gc = new GregorianCalendar();
temp = gc.AddWeeks(DateTime.Parse("01-01-" + year.ToString()), week-1);
temp = gc.AddDays(temp, 1-((int)gc.GetDayOfWeek(temp)));

[ Voor 3% gewijzigd door Nazgul op 05-08-2003 14:32 . Reden: Denkfoutje ]

No trees were killed in the sending of this message. However a large number of electrons were terribly inconvenienced.


Verwijderd

Hiervoor kan je toch gewoon een DateTime gebruiken...?

  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 14-12 16:10
Houd wel rekening met schikkeljaren.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10-12 17:10
Nazgul schreef op 05 August 2003 @ 14:02:
Je kunt er van uit gaan dat 01-01-xxxx altijd in week 1 van een jaar valt.
Volgens mij kan 1-1 ook in week 53 van het jaar daarvoor liggen.

Week 1 is de 1e week waarvan 4 dagen in het nieuwe jaar vallen. ( Maw, als de donderdag van een week in het nieuwe jaar ligt, is dat week 1 )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • sander_g
  • Registratie: Juli 2002
  • Nu online
Het is wel geen C#, maar VB.NET. Volgens mij kan je dat makkelijk ombouwen.

code:
1
2
3
4
5
6
7
8
9
10
Public Shared Function DateFromWeekNr(ByVal weeknr As Integer, ByVal year As Integer) As DateTime

        Dim c As New GregorianCalendar(GregorianCalendarTypes.Localized)
        Dim weekoffset As Integer
        weekoffset = c.GetWeekOfYear(DateTime.Parse("01-02-" + _
            year.ToString()), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
        Dim t As DateTime = c.AddWeeks(DateTime.Parse("01-01-" + year.ToString()), weeknr - weekoffset)
        Return c.AddDays(t, 1 - (Convert.ToInt16(c.GetDayOfWeek(t))))

End Function


en om het te testen:

code:
1
2
3
4
5
6
7
8
9
10
11
        Dim c As New GregorianCalendar(GregorianCalendarTypes.Localized)

        Dim i As Integer
        For i = 1994 To 2017
            Console.Write(i & ", week 25 -> ")
            Dim d As DateTime = DateFromWeekNr(25, i)
            Console.Write(d)
            Console.Write(" is weeknr: ")
            Console.WriteLine(c.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
        Next
        Console.ReadLine()

Garmin Fēnix 7 Pro | https://www.strava.com/athletes/30783039


  • Nazgul
  • Registratie: Februari 2000
  • Laatst online: 11-10-2022

Nazgul

Digital Pizza Crew

farlane schreef op 05 August 2003 @ 15:29:
Volgens mij kan 1-1 ook in week 53 van het jaar daarvoor liggen.
De TS gebruikt in zijn stukje code CalendarWeekRule.FirstDay, dus werkt hij met het 01-01 is week 1 principe.
Je zou gelijk hebben als hij CalendarWeekRule.FirstFourDayWeek zou gebruiken. :)


Maar ik zie nu wel een klein foutje in mijn code. Hij gaat fout als 01-01 op een zondag valt, aangezien de enum System.DayOfWeek begint bij zondag en niet bij maandag.
Dus in plaats van naar de maandag van die week te springen, springt hij naar de maandag van de week erop.
Maar dat is met een simpele if..else ook wel op te lossen.

No trees were killed in the sending of this message. However a large number of electrons were terribly inconvenienced.


Verwijderd

Topicstarter
Nazgul schreef op 05 August 2003 @ 14:02:
knip..

Je krijgt dan zoiets:
C#:
1
2
3
4
5
6
7
int year=2003;
int week=32;

DateTime temp;
GregorianCalendar gc = new GregorianCalendar();
temp = gc.AddWeeks(DateTime.Parse("01-01-" + year.ToString()), week-1);
temp = gc.AddDays(temp, 1-((int)gc.GetDayOfWeek(temp)));
Hey Nazgul, ik heb het even op deze manier geprobeerd en aan een aantal testjes onderworpen en ik moet zeggen: Het ziet er goed uit!! :)

Bedankt allemaal voor de snelle reacties!

[ Voor 3% gewijzigd door Verwijderd op 05-08-2003 16:50 ]

Pagina: 1