Avatar billede tigertool Nybegynder
17. november 2005 - 15:19 Der er 18 kommentarer og
1 løsning

Datoer i ugen udfra uge nummer og årstal

Hej,

Jeg har et årstal og et uge nummer, og ud fra det skal jeg vide hvilken dato der er i den uge. Hvordan gøres dette i C#?
Avatar billede arne_v Ekspert
17. november 2005 - 15:22 #1
den havde vi for et par måneder siden

mit forslag var:

using System;

namespace E
{
    public class Util
    {
        public static int WeekNumber(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;
        }
    }
    class MainClass
    {
        public static void Test(int year, int week)
        {
            DateTime dt = new DateTime(year, 1, 1);
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) > 1)
            {
                dt = dt.AddDays(1);
            }
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) < week)
            {
                dt = dt.AddDays(1);
            }
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) == week)
            {
                Console.WriteLine(dt.ToString("dd-MMM-yyyy"));
                dt = dt.AddDays(1);
            }
        }
        public static void Main(string[] args)
        {
            Test(2005, 39);
            Test(2005, 40);
        }
    }
}
Avatar billede tigertool Nybegynder
17. november 2005 - 15:26 #2
Ok - set fint ud :)
smid et svar
Avatar billede arne_v Ekspert
17. november 2005 - 15:27 #3
der var faktisk en som havde en forbedring til den - prøv og søg i de gamle spørgsmål -
det var engang i september
Avatar billede arne_v Ekspert
17. november 2005 - 15:27 #4
svar
Avatar billede dr_chaos Nybegynder
18. november 2005 - 08:25 #5
et dumt spørgsmål.
Tager den højde for skudår ?
Avatar billede arne_v Ekspert
18. november 2005 - 08:32 #6
ja
Avatar billede dr_chaos Nybegynder
18. november 2005 - 08:33 #7
ok gemmer den lige som et bookmark så :)
Avatar billede arne_v Ekspert
18. november 2005 - 08:34 #8
men år jeg nu kigger på den

måske skal

DateTime dt = new DateTime(year, 1, 1);

være

DateTime dt = new DateTime(year-1, 12, 29);

fordi uge 1 kan vel starte i forrige år
Avatar billede arne_v Ekspert
18. november 2005 - 08:34 #9
jeg mener at det er

+ y/4 - y/100 + y/400

som dækker skudår
Avatar billede dr_chaos Nybegynder
18. november 2005 - 08:38 #10
nej uge 1 starter i den nye år men uge 53 kan gå ind i det nye år.
det gjorde den i 2004/2005.
Avatar billede dr_chaos Nybegynder
18. november 2005 - 08:38 #11
iflg min kalender :)
Avatar billede arne_v Ekspert
18. november 2005 - 08:59 #12
ja men der er jo andre år
Avatar billede arne_v Ekspert
18. november 2005 - 08:59 #13
using System;

namespace E
{
    public class Util
    {
        public static int WeekNumber(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;
        }
    }
    class MainClass
    {
        public static void Test(int year, int week)
        {
            Console.WriteLine(year + "/" + week + ":");
            DateTime dt = new DateTime(year, 1, 1);
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) > 1)
            {
                dt = dt.AddDays(1);
            }
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) < week)
            {
                dt = dt.AddDays(1);
            }
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) == week)
            {
                Console.WriteLine(dt.ToString("dd-MMM-yyyy"));
                dt = dt.AddDays(1);
            }
        }
        public static void Main(string[] args)
        {
            Test(2000, 1);
            Test(2001, 1);
            Test(2002, 1);
            Test(2003, 1);
            Test(2004, 1);
            Test(2005, 1);
            Test(2006, 1);
        }
    }
}

giver:

2000/1:
03-jan-2000
04-jan-2000
05-jan-2000
06-jan-2000
07-jan-2000
08-jan-2000
09-jan-2000
2001/1:
01-jan-2001
02-jan-2001
03-jan-2001
04-jan-2001
05-jan-2001
06-jan-2001
07-jan-2001
2002/1:
01-jan-2002
02-jan-2002
03-jan-2002
04-jan-2002
05-jan-2002
06-jan-2002
2003/1:
01-jan-2003
02-jan-2003
03-jan-2003
04-jan-2003
05-jan-2003
2004/1:
01-jan-2004
02-jan-2004
03-jan-2004
04-jan-2004
2005/1:
03-jan-2005
04-jan-2005
05-jan-2005
06-jan-2005
07-jan-2005
08-jan-2005
09-jan-2005
2006/1:
02-jan-2006
03-jan-2006
04-jan-2006
05-jan-2006
06-jan-2006
07-jan-2006
08-jan-2006
Avatar billede arne_v Ekspert
18. november 2005 - 09:00 #14
using System;

namespace E
{
    public class Util
    {
        public static int WeekNumber(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;
        }
    }
    class MainClass
    {
        public static void Test(int year, int week)
        {
            Console.WriteLine(year + "/" + week + ":");
            DateTime dt = new DateTime(year-1, 12, 29);
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) > 1)
            {
                dt = dt.AddDays(1);
            }
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) < week)
            {
                dt = dt.AddDays(1);
            }
            while(Util.WeekNumber(dt.Year, dt.Month, dt.Day) == week)
            {
                Console.WriteLine(dt.ToString("dd-MMM-yyyy"));
                dt = dt.AddDays(1);
            }
        }
        public static void Main(string[] args)
        {
            Test(2000, 1);
            Test(2001, 1);
            Test(2002, 1);
            Test(2003, 1);
            Test(2004, 1);
            Test(2005, 1);
            Test(2006, 1);
        }
    }
}

giver

2000/1:
03-jan-2000
04-jan-2000
05-jan-2000
06-jan-2000
07-jan-2000
08-jan-2000
09-jan-2000
2001/1:
01-jan-2001
02-jan-2001
03-jan-2001
04-jan-2001
05-jan-2001
06-jan-2001
07-jan-2001
2002/1:
31-dec-2001
01-jan-2002
02-jan-2002
03-jan-2002
04-jan-2002
05-jan-2002
06-jan-2002
2003/1:
30-dec-2002
31-dec-2002
01-jan-2003
02-jan-2003
03-jan-2003
04-jan-2003
05-jan-2003
2004/1:
29-dec-2003
30-dec-2003
31-dec-2003
01-jan-2004
02-jan-2004
03-jan-2004
04-jan-2004
2005/1:
03-jan-2005
04-jan-2005
05-jan-2005
06-jan-2005
07-jan-2005
08-jan-2005
09-jan-2005
2006/1:
02-jan-2006
03-jan-2006
04-jan-2006
05-jan-2006
06-jan-2006
07-jan-2006
08-jan-2006
Avatar billede dr_chaos Nybegynder
18. november 2005 - 09:03 #15
hmm der er en forskel på de 2 måder.
En af dem er den rigtige.
Jeg tror det er den første af dem.
Avatar billede arne_v Ekspert
18. november 2005 - 09:08 #16
jeg er sikker på at det er den sidste

uger er hele uge

uge 1 = første uge i året med 4 eller flere daga = ugen med den første torsdag i året
Avatar billede dr_chaos Nybegynder
18. november 2005 - 10:02 #17
hvis det er den sidste så er min mayland kalender forkert på den.
Avatar billede arne_v Ekspert
18. november 2005 - 13:16 #18
hm - de burde da ellers vide det

men


http://jeppesn.dk/uge.html
http://ugenr.dk/?opslag=31-12-2003

siger altså noget andet
Avatar billede dr_chaos Nybegynder
18. november 2005 - 13:22 #19
tror du har ret jeg lagde ikke mærke til at nytår 2004/2005 var ens :)
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