17. juli 2006 - 17:05Der er
11 kommentarer og 1 løsning
Konvertering af DateTime.DayOfWeek til int32 vha IFormatProvider
Er der mon en ekspert, der ved hvordan jeg bruger IFormatProvider, når jeg skal konvertere en DateTime.DayOfWeek til int32?
Selve koden har jeg intet problem med, men brugen af IFormatProvider i forskellige sammenhænge forekommer mig kryptisk.
Problemet er følgende: Jeg har en dato streng "01-Jan-06" som jeg konverterer til DateTime: dtDato = DateTime.Parse(dato); Nu vil jeg så gerne have ugedagen. Ingen problemer hvis jeg bruger dayOfWeek = Convert.ToInt32(dtDato.DayOfWeek);
Men kører jeg FXCop op imod biblioteket hvori denne kode findes brokker den sig over, at jeg ikke bruger IFormatProvider.
Et meget enkelt eksempel ville være dejligt. MSDN eksemplerne tager pusten fra mig :)
Tak skal I have, begge to. Hvad gør vi nu? Jeg kan bruge begge løsninger i forskellige sammenhænge. Hvad siger I til at dele point? Hvis det er OK med jer at dele, send mig et svar hver. Ellers kom med et andet forslag. Og endnu en gang tak.
Og noget helt andet, er der nogen af jer der ved, hvor der findes f.eks. tutorials eller forståelige eksempler på strong naming of assemblies? Eller er det bedst at oprette et nyt spm.?
namespace E { public class MainClass { public static void Main(string[] args) { Console.WriteLine((int)DateTime.Now.DayOfWeek); Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek)); Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek, new CultureInfo("da-DK"))); Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek, new CultureInfo("en-US"))); Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek, null)); } } }
Tak for inputtet. 2 i alle tilfælde. Tilsyneladende er der ingen forskel på ugedagens numre, uanset hvordan CultureInfo er sat, og tilsyneladende har new CultureInfo("da-DK") eller CultureInfo("en-US") ingen indflydelse på output. På mit engelske system er dato output også ens i begge tilfælde: 18-Jul-06 02:15:54
Hvis jeg nu bruger using System.Threading;
og gør følgende:
CultureInfo ci = CultureInfo.CurrentCulture; // fanger min nuværende CultureInfo Thread.CurrentThread.CultureInfo = new CultureInfo("da-DK"); // skifter til dansk Console.WriteLine(DateTime.Now.ToString()); Output: 18-07-2006 02:15:54 Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek)); Output: 2
Thread.CurrentThread.CultureInfo = ci; // sætter tilbage til engelsk Console.WriteLine(DateTime.Now.ToString()); Output: 18-Jul-06 02:15:54 Console.WriteLine(Convert.ToInt32(DateTime.Now.DayOfWeek)); Output: 2
Endnu en gang tak for inputtet. Godt med én til tænkeren :)
Mit oprindelige spørgsmål gik på brugen af IFormatProvider og FXCop's brokken sig over min mangelende brug af provideren, og den er tilfreds med
Convert.ToInt32(DateTime.Now.DayOfWeek, CultureInfo.CurrentCulture); eller Convert.ToInt32(DateTime.Now.DayOfWeek, new CultureInfo("en-US"));
så jeg regner med at de designmæssige best practises er dækket.
Dit meget anstændige input :) åbnede dog øjnene for hvordan datoer til og fra databaser kan håndteres uanset hvilken kulturinfo der er til stede på brugerens system. Stor tak!
Ups, det var ikke meningen. Pointene skulle have været delt, så der var 30 til dig og 30 til md_craig. Er der en mulighed for at lave dette om. Hvis ikke kan jeg så oprette et nyt spm., som md_craig kan svare på..? Jeg er ret rusten her.
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.