Avatar billede websam Nybegynder
08. februar 2006 - 09:39 Der er 15 kommentarer og
1 løsning

Finde dato ud fra uge nummer ?

Hejsa,

Er det muligt ud fra et uge nummer at finde ugens 7 dages datoer. Forstået på den måde at jeg kender uge nummeret for et givent år og på den måde automatisk sætte datoerne for dagene.

Ps. jeg arbejder i .net 1.1

/Websam
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 09:44 #1
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);
        }
    }
}
Avatar billede websam Nybegynder
08. februar 2006 - 10:03 #2
Ok jeg har lige lavet det om til VB :

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Test(2000, 1)
        Test(2001, 1)
        Test(2002, 1)
        Test(2003, 1)
        Test(2004, 1)
        Test(2005, 1)
        Test(2006, 1)
    End Sub

    Public Function WeekNumber(ByVal year As Integer, ByVal mon As Integer, ByVal day As Integer) As Integer
        Dim a As Integer = (14 - mon) / 12
        Dim y As Integer = year + 4800 - a
        Dim m As Integer = mon + 12 * a - 3
        Dim JD As Integer = day + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045
        Dim d4 As Integer = (((JD + 31741 - JD Mod 7) Mod 146097) Mod 36524) Mod 1461
        Dim L As Integer = d4 / 1460
        Dim d1 As Integer = ((d4 - L) Mod 365) + L
        Return d1 / 7 + 1
    End Function

    Public Sub Test(ByVal year As Integer, ByVal week As Integer)
        Response.Write(year + "/" + week + ":")
        Dim dt As DateTime = New DateTime(year - 1, 12, 29)
        While WeekNumber(dt.Year, dt.Month, dt.Day) > 1
            dt = dt.AddDays(1)
        End While
        While WeekNumber(dt.Year, dt.Month, dt.Day) < week
            dt = dt.AddDays(1)
        End While
        While WeekNumber(dt.Year, dt.Month, dt.Day) = week
            Response.Write(dt.ToString("dd-MMM-yyyy"))
            dt = dt.AddDays(1)
        End While
    End Sub

men jeg får en fejl der siger :

Input string is in a wrong format (eller noget i den stil)

i denne linie :

Response.Write(year + "/" + week + ":")

Hvad skyldes det ?

/Websam
Avatar billede websam Nybegynder
08. februar 2006 - 10:15 #3
Ok den fandt jeg ud, linien skulle bare slettes. Men når jeg så laver en test :

    Test(2006, 6) 'denne uge

Så udskriver den :

    05-02-2007
    06-02-2007
    07-02-2007
    08-02-2007
    09-02-2007
    10-02-2007
    11-02-2007

Og det skulle være for dette år ?

/Websam
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 10:18 #4
prøv at følge year variablen for at se hvor den giver fejl.
Avatar billede websam Nybegynder
08. februar 2006 - 10:27 #5
Umiddelbart når jeg laver en debug ser det ud til at det er 2006 den får med rundt, men hvorfor den så skriver 2007 forstår jeg ikke helt ?

/Websam
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 10:29 #6
hvilket et year får du ud i dt variablen ?
Avatar billede websam Nybegynder
08. februar 2006 - 10:37 #7
Der har jeg lige prøvet følgende :

Dim dt As DateTime = New DateTime(year - 1, 12, 29)
Response.Write(dt.Year & "-")

Resultat = 2005

While WeekNumber(dt.Year, dt.Month, dt.Day) > 1
    Response.Write(dt.Year & "-")
    dt = dt.AddDays(1)
End While

Resultat = 2006

While WeekNumber(dt.Year, dt.Month, dt.Day) < week
    Response.Write(dt.Year & "-")
    dt = dt.AddDays(1)
End While

Resultat = 2006

While WeekNumber(dt.Year, dt.Month, dt.Day) = week
    Response.Write(dt.Year & "-")
    Response.Write(dt.ToString("dd-MM-yyyy") & ";<br>")
    dt = dt.AddDays(1)
End While

Resultat = 2007

Og så skal den jo skrive 2007 i det færdige resultat.
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 10:49 #8
prøv bare med denne
While WeekNumber(dt.Year, dt.Month, dt.Day) = week
            Response.Write(dt.ToString("dd-MMM-yyyy"))
            dt = dt.AddDays(1)
        End While
og intet andet
Avatar billede websam Nybegynder
08. februar 2006 - 10:58 #9
Så får jeg dette :

05-feb-2007
06-feb-2007
07-feb-2007
08-feb-2007
09-feb-2007
10-feb-2007
11-feb-2007
Avatar billede websam Nybegynder
08. februar 2006 - 11:01 #10
og det er jo også netop ved den sidste While at den laver året om til 2007 i de andre er det 2006.

så jeg er lidt blank på dette.

/Websam
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 11:26 #11
problemet ligger i forskellene mellem vb og c#.
Koden virker som den skal i c#.
Lavede en test i vb.
  Private Sub test(ByVal year As Integer, ByVal week As Integer)
        Dim dt As DateTime = New DateTime(year - 1, 12, 29)
        While WeekNumber(dt.Year, dt.Month, dt.Day) > 1
            Response.Write(dt.ToString("dd-MMM-yyyy") + "n<br />")
            dt = dt.AddDays(1)
        End While
        While WeekNumber(dt.Year, dt.Month, dt.Day) < week
            Response.Write(dt.ToString("dd-MMM-yyyy") + "m<br />")
            dt = dt.AddDays(1)
        End While
        While WeekNumber(dt.Year, dt.Month, dt.Day) = week
            Response.Write(dt.ToString("dd-MMM-yyyy") + "b<br />")
            dt = dt.AddDays(1)
        End While
    End Sub

prøv at indsætte den på din side så kan du se at der er et alvorligt problem.
Avatar billede websam Nybegynder
08. februar 2006 - 11:34 #12
For mig ser det da rigtigt ud hvori ligger fejlen i det den udskriver ?

/Websam
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 12:15 #13
så lykkedes det:

  Public Shared Function WeekNumber(ByVal year As Integer, ByVal mon As Integer, ByVal day As Integer) As Integer
        Dim a, y, m, JD, d4, L, d1 As Integer
        a = (14 - mon) \ 12
        y = year + 4800 - a
        m = mon + 12 * a - 3
        JD = day + (153 * m + 2) \ 5 + 365 * y + y \ 4 - y \ 100 + y \ 400 - 32045
        d4 = (((JD + 31741 - JD Mod 7) Mod 146097) Mod 36524) Mod 1461
        L = d4 \ 1460
        d1 = ((d4 - L) Mod 365) + L
        WeekNumber = d1 \ 7 + 1
    End Function
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 12:15 #14
jeg tror problemet ligger i den måde hvor på \ og / tolkes i vb
Avatar billede websam Nybegynder
08. februar 2006 - 12:19 #15
Ja det ligger helt fast at / = division i vb

Takker for hjælpen
Avatar billede dr_chaos Nybegynder
08. februar 2006 - 12:20 #16
np :)
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