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)
Annonceindlæg tema
23. november 2005 - 18:50
#1
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));
23. november 2005 - 19:00
#3
ser sikkert rigtigt ud,.. ved du om det findes nogen steder oversat til mere web-agtigt?
23. november 2005 - 19:01
#4
... label1.Text = Cal.GetWeekOfYear(dato, CWR, FDoW).ToString();
23. november 2005 - 19:04
#5
nielles eksempel er hvad du har brug for.
23. november 2005 - 19:08
#6
I hvilket namespace ligger Cultureinfo ?
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); } } } }
23. november 2005 - 19:12
#8
23/11-2005 19:08:31> using System.Globalization;
23. november 2005 - 19:15
#9
:o) jeg så det undskyld,.. nu mangler jeg namespacet til kalenderen..... :o)
23. november 2005 - 19:18
#10
Calendar ligger også i det namespace.
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)
23. november 2005 - 19:29
#12
Det er nu ikke den samme Calendar det drejer sig om :^)
23. november 2005 - 19:57
#13
Nej, derfor jeg fik fejlen... :o)
23. november 2005 - 20:00
#14
der er ikke nogen som har prøvet at køre mit program ?
23. november 2005 - 20:22
#15
Tæller jeg med?
23. november 2005 - 20:23
#16
ja hvad mener du om output ?
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?
23. november 2005 - 20:31
#18
Week3() - ikke Test3()...
23. november 2005 - 20:35
#20
det tror jeg faktisk
23. november 2005 - 20:39
#21
Det er da en mulighed - hvor har du Week3()-algoritmen fra?
23. november 2005 - 20:40
#22
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 ,-(
23. november 2005 - 20:49
#24
Det virker sikkert perfekt med amerikanske ugenumre ...
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
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 !-)
23. november 2005 - 20:56
#27
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 )
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.