Avatar billede alex_sleiborg Nybegynder
14. november 2006 - 12:12 Der er 9 kommentarer og
1 løsning

Smide 52 uger ind i et array

Jeg skal have 52 uger smidt ind i et, array eller arraylist. Altså den første uge skal jo selvfølgelig være den uge vi har nu. Og så skal de næste bare smides ind i array'et, men på et tidspunkt kommer den jo til at gå fra 52/53 til 1. Nogen der har en ide til hvordan det kan laves???
Avatar billede bulgroz Nybegynder
14. november 2006 - 13:14 #1
Der er mange muligheder, men du kan f.eks. gøre således:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            List<int> weekNumbers = GetWeekNumbers(52);

            StringBuilder stringBuilder = new StringBuilder();
            foreach (int weekNumber in weekNumbers)
            {
                stringBuilder.AppendLine(weekNumber.ToString());
            }

            MessageBox.Show(stringBuilder.ToString());
        }

        /// <summary>
        /// Gets a list of week-numbers.
        /// </summary>
        /// <param name="amount">How many weeks to add.</param>
        /// <returns></returns>
        private static List<int> GetWeekNumbers(int weeksToAdd)
        {
            List<int> weekNumbers = new List<int>();
            DateTime dateTime = DateTime.Now;
            Calendar calendar = CultureInfo.InvariantCulture.Calendar;

            for (int i = 0; i < weeksToAdd; i++)
            {
                int weekNumber = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
                weekNumbers.Add(weekNumber);
                dateTime = dateTime.AddDays(7);
            }

            return weekNumbers;
        }
Avatar billede alex_sleiborg Nybegynder
14. november 2006 - 13:47 #2
Det virker mange tak. Jeg skulle så ikke lige bruge en stringbuilder, men det er jo lige meget. Det var lige sådan en metode jeg manglede:)
Avatar billede bulgroz Nybegynder
14. november 2006 - 13:57 #3
StringBuilderen var der blot for at visualicere hvad metoden lavede... (test)
Avatar billede arne_v Ekspert
15. november 2006 - 03:01 #4
vær opmærksom på at GetWeekOfYear returnerer forkerte resultater !
Avatar billede alex_sleiborg Nybegynder
15. november 2006 - 07:18 #5
Jeg havde godt nok læst et eller andet sted, hvor der stod noget om den returnede noget forkert... Gider du forklare nærmere arne?
Avatar billede bulgroz Nybegynder
15. november 2006 - 08:05 #6
Den burde da virke korrekt når du får den sat op til korrekt culture (Mit eksemåpel anvender blot InvariantCulture hvilket egentligt er forkert).

Følgende link er til eksemplet fra MSDN (og der står desværre ikke noget om problemområder)

http://msdn2.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx

Så ja Arne, jeg betvivler absolut ikke at du har ret, men jeg kunne også godt tænke mig en forklaring.
Avatar billede alex_sleiborg Nybegynder
15. november 2006 - 10:38 #7
Ja mener jeg læste at fejlen ligger i .NET og endnu ikke er blevet rettet. Men vil også meget gerne høre nærmere
Avatar billede arne_v Ekspert
15. november 2006 - 13:09 #8
MS har aldrig fået lavet ISO uge numre rigtig.

Prøv og kør følgende:

using System;
using System.Globalization;

namespace E
{
    public class TimeUtil
    {
        public static int Week1(int year, int mon, int day)
        {
            return (new CultureInfo("da-DK")).Calendar.GetWeekOfYear(new DateTime(year, mon, day), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        }
        public static int Week2(int year, int mon, int day)
        {
            int a = (14 - mon) / 12;
            int y = year + 4800 - a;
            int m = mon + 12*a - 3;
            int JD = day + (153 * m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045;
            int d4 = (((JD + 31741 - JD % 7) % 146097) % 36524) % 1461;
            int L = d4 / 1460;
            int d1 = ((d4 - L) % 365) + L;
            return d1 / 7 + 1;
        }
    }
    public class TestClass
    {
        public static void Test(int year, int mon, int day)
        {
            Console.WriteLine((new DateTime(year, mon, day)).ToString("dddd dd/MM/yyyy") + ": " +
                              TimeUtil.Week1(year, mon, day) + " " +
                              TimeUtil.Week2(year, mon, day));
        }
        public static void Main(string[] args)
        {
            for(int y = 2002; y < 2008; y++)
            {
                Test(y, 12, 28);
                Test(y, 12, 29);
                Test(y, 12, 30);
                Test(y, 12, 31);
                Test(y+1, 1, 1);
                Test(y+1, 1, 2);
                Test(y+1, 1, 3);
                Test(y+1, 1, 4);
                Test(y+1, 1, 5);
                Test(y+1, 1, 6);
            }
            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
15. november 2006 - 13:10 #9
der er forskel og det er nemt at se at Week2 er korrekt (ISO siger at uge 1 er
den uge hvor den første torsdag i året er i)
Avatar billede bulgroz Nybegynder
15. november 2006 - 13:19 #10
Nydeligt, tak for svaret.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester