Avatar billede bongo20 Nybegynder
23. november 2005 - 18:47 Der er 27 kommentarer og
1 løsning

C# find ugenummer

Hej

Hvordan finder jeg ugens nummer ud fra en dato.
Altså hvordan finder jeg ud af i hvilken uge f.eks. DateTime.Now ligger?

:o)
Avatar billede dr_chaos Nybegynder
23. november 2005 - 18:50 #1
prøv at kigge her:
http://exp.dk/spm/665318
Avatar billede nielle Nybegynder
23. november 2005 - 18:59 #2
Eller sådan:

CultureInfo CI = new CultureInfo("da-DK");
Calendar Cal = CI.Calendar;
CalendarWeekRule CWR = CI.DateTimeFormat.CalendarWeekRule;
DayOfWeek FDoW = CI.DateTimeFormat.FirstDayOfWeek;

DateTime dato = new DateTime(2005, 11, 23);
Console.WriteLine(Cal.GetWeekOfYear(dato, CWR, FDoW));
Avatar billede bongo20 Nybegynder
23. november 2005 - 19:00 #3
ser sikkert rigtigt ud,.. ved du om det findes nogen steder oversat til mere web-agtigt?
Avatar billede nielle Nybegynder
23. november 2005 - 19:01 #4
...
label1.Text = Cal.GetWeekOfYear(dato, CWR, FDoW).ToString();
Avatar billede dr_chaos Nybegynder
23. november 2005 - 19:04 #5
nielles eksempel er hvad du har brug for.
Avatar billede bongo20 Nybegynder
23. november 2005 - 19:08 #6
I hvilket namespace ligger Cultureinfo ?
Avatar billede arne_v Ekspert
23. november 2005 - 19:11 #7
using System;
using System.Globalization;

using Microsoft.VisualBasic;

namespace E
{
    public class TimeUtil
    {
        public static int Week1(int year, int mon, int day)
        {
            return (new CultureInfo("da-DK", false)).Calendar.GetWeekOfYear(new DateTime(year, mon, day), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        }
        public static int Week2(int year, int mon, int day)
        {
            return DateAndTime.DatePart("ww", new DateTime(year, mon, day), Constants.vbMonday, Constants.vbFirstFourDays);
        }
        public static int Week3(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) + " " +
                              TimeUtil.Week3(year, mon, day));
        }
        public static void Main(string[] args)
        {
            for(int y = 2002; y < 2006; 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);
            }
        }
    }
}
Avatar billede nielle Nybegynder
23. november 2005 - 19:12 #8
23/11-2005 19:08:31>

using System.Globalization;
Avatar billede bongo20 Nybegynder
23. november 2005 - 19:15 #9
:o) jeg så det undskyld,.. nu mangler jeg namespacet til kalenderen.....

:o)
Avatar billede nielle Nybegynder
23. november 2005 - 19:18 #10
Calendar ligger også i det namespace.
Avatar billede bongo20 Nybegynder
23. november 2005 - 19:27 #11
og også i web.ui

men du har helt ret det er globalization jeg skal bruge...

Mange tak for hjælpen nielle. Smider du et svar?

:o)
Avatar billede nielle Nybegynder
23. november 2005 - 19:29 #12
Det er nu ikke den samme Calendar det drejer sig om :^)
Avatar billede bongo20 Nybegynder
23. november 2005 - 19:57 #13
Nej, derfor jeg fik fejlen... :o)
Avatar billede arne_v Ekspert
23. november 2005 - 20:00 #14
der er ikke nogen som har prøvet at køre mit program ?
Avatar billede nielle Nybegynder
23. november 2005 - 20:22 #15
Tæller jeg med?
Avatar billede arne_v Ekspert
23. november 2005 - 20:23 #16
ja

hvad mener du om output ?
Avatar billede nielle Nybegynder
23. november 2005 - 20:30 #17
Jeg nyesn at det er lidt interessant at der er forskel på ugenummere for datoerne lige omkring nytår:

lørdag 28-12-2002: 52 52 52
søndag 29-12-2002: 52 52 52
mandag 30-12-2002: 53 53 1
tirsdag 31-12-2002: 53 53 1
onsdag 01-01-2003: 1 1 1
torsdag 02-01-2003: 1 1 1
fredag 03-01-2003: 1 1 1
lørdag 04-01-2003: 1 1 1
søndag 05-01-2003: 1 1 1
mandag 06-01-2003: 2 2 2
søndag 28-12-2003: 52 52 52
mandag 29-12-2003: 53 53 1
tirsdag 30-12-2003: 53 53 1
onsdag 31-12-2003: 53 53 1
torsdag 01-01-2004: 1 1 1
fredag 02-01-2004: 1 1 1
lørdag 03-01-2004: 1 1 1
søndag 04-01-2004: 1 1 1
mandag 05-01-2004: 2 2 2
tirsdag 06-01-2004: 2 2 2
tirsdag 28-12-2004: 53 53 53
onsdag 29-12-2004: 53 53 53
torsdag 30-12-2004: 53 53 53
fredag 31-12-2004: 53 53 53
lørdag 01-01-2005: 53 53 53
søndag 02-01-2005: 53 53 53
mandag 03-01-2005: 1 1 1
tirsdag 04-01-2005: 1 1 1
onsdag 05-01-2005: 1 1 1
torsdag 06-01-2005: 1 1 1
onsdag 28-12-2005: 52 52 52
torsdag 29-12-2005: 52 52 52
fredag 30-12-2005: 52 52 52
lørdag 31-12-2005: 52 52 52
søndag 01-01-2006: 52 52 52
mandag 02-01-2006: 1 1 1
tirsdag 03-01-2006: 1 1 1
onsdag 04-01-2006: 1 1 1
torsdag 05-01-2006: 1 1 1
fredag 06-01-2006: 1 1 1

Skal det forstås sådan at du vurdere at Test3() giver et mere korrekt resultat frem for Frameworket?
Avatar billede nielle Nybegynder
23. november 2005 - 20:31 #18
Week3() - ikke Test3()...
Avatar billede dr_chaos Nybegynder
23. november 2005 - 20:33 #19
der er en forskel på ugerne omkring nytår:

her er to links arne skrev i den post jeg referer til:

http://jeppesn.dk/uge.html
http://ugenr.dk/?opslag=31-12-2003
Avatar billede arne_v Ekspert
23. november 2005 - 20:35 #20
det tror jeg faktisk
Avatar billede nielle Nybegynder
23. november 2005 - 20:39 #21
Det er da en mulighed - hvor har du Week3()-algoritmen fra?
Avatar billede arne_v Ekspert
23. november 2005 - 20:40 #22
Avatar billede roenving Novice
23. november 2005 - 20:44 #23
VB(x)s problemer med uge 53/1 er jo en klassiker, fantastisk, at den ikke er blevet angrebet i .NET ,-(
Avatar billede arne_v Ekspert
23. november 2005 - 20:49 #24
Det virker sikkert perfekt med amerikanske ugenumre ...
Avatar billede nielle Nybegynder
23. november 2005 - 20:54 #25
Det er nu kun Week2()-eksemplet som bruger VB.NET (klassen DateAndTime fra Microsoft.VisualBasic), men fejlen ser ud til at være der i Week1()-koden som er helt generel framework-kode.

Men ja, det ser bestemt ud til at være en fejl. Nu er jeg lidt usikker på algoritmen fra:

http://www.tondering.dk/claus/cal/node7.html#SECTION00780000000000000000

- fordi: starter hans uge med mandag eller søndag? Det er jo ikke ens over alt, og kunne i praksis forskyde ugenumrene.

... men hvis vi f.eks. tager udgangspunkt i:

http://jeppesn.dk/uge.html

- og vi så kigger på datoen 4/1-2003, ja så skal denne jo ligge i uge 1. Men det betyder så at 30/12 og 31/12 i 2002 også må ligge i uge 1:

http://www.rmadsen.dk/kal/dk5e.htm#2003
Avatar billede roenving Novice
23. november 2005 - 20:56 #26
Jepz, men selv ikke reparationen med

CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday

og/eller

Constants.vbMonday, Constants.vbFirstFourDays

-- ser ud til at reparerer åbentbart fejlen i forhold til ISO-8601, det kan vel ikke være så svært ?-)

-- iøvrigt er den klassiske løsning at kigge på ugenummeret d. 1/1, hvis mandagen er 28/12 eller senere og ugenummeret er 53 !-)
Avatar billede arne_v Ekspert
23. november 2005 - 20:56 #27
Avatar billede nielle Nybegynder
23. november 2005 - 21:10 #28
roenving> Jeg skal på ingen måde forsøge at forsvare Microsoft - de burde &%#¤# vide bedre end at lade sådan en fejl overleve (måske er det i den "hellige" bagudkompatibilitets skyld?!). Jeg påpegede bare at fejlen også var der i non-VB kode.

(PS: http://www.eksperten.dk/spm/666900)
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