webForumDet fria alternativet

Få fram datum på den första dagen med hjälp av vecka och år

.NET

2 svar · 453 visningar · startad av Nickemannen

Medlem sedan aug. 20003 575 inlägg
Frågan#1

Jag undrar om någon sitter på en kodsnutt där man med hjälp av År och Veckonummer kan få fram datumet på den första dagen i den veckan.

Helst i C# men även de andra ramverksspåken går bra.

Medlem sedan dec. 20003 887 inlägg
#2

C#

DateTime dtFoo = new DateTime( året, 1, 1 );

dtFoo.AddDays( 7 * veckonummer );

if ( dtFoo.DayOfWeek != DayOfWeek.Monday )
  dtFoo.AddDays( DayOfWeek.Monday - dtFoo.DayOfWeek ); // vet inte om man får göra så, men du kanske förstår poängen.

return dtFoo;

Det kanske är någon annan miss här också, eftersom jag brukar ha en förmåga att missa saker när jag kodar i en textbox ;)

Medlem sedan aug. 20003 575 inlägg
#3

Engine^ skrev:

C#

DateTime dtFoo = new DateTime( året, 1, 1 );

dtFoo.AddDays( 7 * veckonummer );

if ( dtFoo.DayOfWeek != DayOfWeek.Monday )
  dtFoo.AddDays( DayOfWeek.Monday - dtFoo.DayOfWeek ); // vet inte om man får göra så, men du kanske förstår poängen.

return dtFoo;

Det kanske är någon annan miss här också, eftersom jag brukar ha en förmåga att missa saker när jag kodar i en textbox ;)

Din ide är bra men fungerar tyvärr inte så bra eftersom den 1 Januari kan ligga mitt i vecka 1 eller i mitten av vecka 52/53 så min lösning blev följande med 4 dagarsregeln.

Den hade säkert gått att göra mer generell men fungerar utmärkt i mitt syfte med 4 dagarsregeln och att veckan börjar med måndag.

				int intSelectedYear = (int)this.cmbYearWeek.SelectedItem;
				DateTime dtFirstWeekStartDate = this.GetFirstDateOfFirstWeekInYear(intSelectedYear);
				
				dtStartDate = dtFirstWeekStartDate.AddDays(7*(((int)this.nupdWeek.Value)-1));

				dtEndDate = dtStartDate.AddDays(6);

		private DateTime GetFirstDateOfFirstWeekInYear(int Year)
		{
			int intSelectedYear = Year;
			DateTime dt = DateTime.Parse(intSelectedYear+"/01/01");
			System.Globalization.Calendar objCalendar = new System.Globalization.CultureInfo("sv-se").Calendar;
			int intWeek = objCalendar.GetWeekOfYear(dt,
				System.Globalization.CalendarWeekRule.FirstFourDayWeek, System.DayOfWeek.Monday);
			
			DayOfWeek dayOfWeek = objCalendar.GetDayOfWeek(dt);
			
			if(intWeek != 1)
			{
				switch(dayOfWeek)
				{
					case DayOfWeek.Friday :
						dt = dt.AddDays(3);
						break;
					case DayOfWeek.Saturday :
						dt = dt.AddDays(2);
						break;
					case DayOfWeek.Sunday :
						dt = dt.AddDays(1);
						break;
				}
			}
			else
			{
				switch(dayOfWeek)
				{
					case DayOfWeek.Tuesday :
						dt = dt.AddDays(-1);
						break;
					case DayOfWeek.Wednesday :
						dt = dt.AddDays(-2);
						break;
					case DayOfWeek.Thursday :
						dt = dt.AddDays(-3);
						break;
				}
			}
			return dt;
		}
264 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)